[英]How do you define and use curry and uncurry (Prelude functions) in Haskell?
如何在Haskell中使用curry
和uncurry
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
您收到錯誤是因為您的類型簽名錯誤,您應該使用元組而不是a
和b
參數的函數:
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個參數a
, b
和c
,並返回類型(a, b) -> c
的函數。
(a -> b -> c) -> ((a, b) -> c)
是一個函數的類型,它接受一個參數a -> b -> c
並返回一個函數(a, b) -> c
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.