(fa)b与Haskell中的(fab)相同吗?

(fa)b与Haskell中的(fab)相同吗?,haskell,currying,Haskell,Currying,在这两个示例中,由于Haskell中的每个函数只能接受一个参数,因此f a b与f a b是否相同?是的,它们完全相同。Haskell将f a b转换为f a b。这叫咖喱。默认情况下,它会对所有函数执行此操作,但可以重写 map2_Maybe :: (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c map2_Maybe f Nothing _ = Nothing map2_Maybe f (Just a) Nothing

在这两个示例中,由于Haskell中的每个函数只能接受一个参数,因此f a b与f a b是否相同?

是的,它们完全相同。

Haskell将f a b转换为f a b。这叫咖喱。默认情况下,它会对所有函数执行此操作,但可以重写

map2_Maybe :: (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c
map2_Maybe f Nothing _ = Nothing
map2_Maybe f (Just a) Nothing = Nothing
map2_Maybe f (Just a) (Just b) = Just ((f a) b)
-- Or: map2_Maybe f (Just a) mb = fmap (f a) mb

map2_Either :: (a -> b -> c) -> Either e a -> Either e b -> Either e c
map2_Either f (Left e) _ = Left e
map2_Either f (Right a) (Left e) = Left e
map2_Either f (Right a) (Right b) = Right (f a b)
-- Or: map2_Either f (Right a) eb = fmap (f a) eb
两者都返回3。函数的结果就是它的值

咖喱功能是自然的

 add = (+)
(add 1 2) -- becomes --  ((add 1) 2) -- upon execution.

是的。出于同样的原因,此空格故意留空,a->b->c和a->b->c的意思也完全相同。是的,这两个表达式产生完全相同的抽象语法树。您能解释一下有关重写咖喱的更多信息吗?这不准确。uncurry将返回一个函数,其中前两个参数取而代之作为一个元组。并非“所有”参数。此外,它不是“重写”curry,而是返回一个不同类型的新函数。返回的函数仍然是curry。
add1 = add 1
add1 2 -- also returns 3