簡體   English   中英

你如何在Haskell中定義和使用curry和uncurry(Prelude函數)?

[英]How do you define and use curry and uncurry (Prelude functions) in Haskell?

如何在Haskell中使用curryuncurry prelude函數?

此外,為什么以下定義在加載時會拋出錯誤?

curry' :: ((a -> b) -> c) -> a -> b -> c
curry' f = \x y -> f (x, y)

uncurry' :: a -> b -> c -> ((a -> b) -> c)
uncurry' f = \(x,y) -> f x y

您收到錯誤是因為您的類型簽名錯誤,您應該使用元組而不是ab參數的函數:

curry' :: ((a, b) -> c) -> a -> b -> c
uncurry' :: (a -> b -> c) -> ((a, b) -> c)

另外,請注意我添加到uncurry'類型的括號,這些在這種情況下很重要。 你有什么相當於

uncurry' :: a -> (b -> (c -> ((a -> b) -> c)))

這是不一樣的,這是一個函數,它接受3個參數並產生一個函數,而不是一個函數,它接受一個2參數函數並返回一個元組參數的函數。

您可以使用這些功能

> uncurry (+) (1, 2)
3
> curry fst 1 2
1
> curry snd 1 2
2

(我沒有看到任何其他以元組為參數的Prelude函數)

編輯:在chi的要求下,這是對最后一句話的更直觀的解釋:

a -> (b -> (c -> ((a, b) -> c)))

是一個函數的類型,它接受3個參數abc ,並返回類型(a, b) -> c的函數。

(a -> b -> c) -> ((a, b) -> c)

是一個函數的類型,它接受一個參數a -> b -> c並返回一個函數(a, b) -> c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM