在Haskell中,((f a) b)和(f a b)是相同的吗?

3
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

在这两个例子中,((f a) b)(f a b)是一样的吗?因为在Haskell中,每个函数只能接受一个参数。

7
是的,没错。 - n. m.
5
出于同样的原因,(a -> b -> c)(a -> (b -> c))也完全意味着相同的事情。 - DarthFennec
1
是的,这两个表达式的抽象语法树完全相同。 - Willem Van Onsem
2个回答

4

是的,它们完全相同。


0
Haskell将(f a b)转换为((f a)b)。这被称为柯里化。默认情况下,它对所有函数执行此操作,但可以被覆盖。
 add = (+)
(add 1 2) -- becomes --  ((add 1) 2) -- upon execution.

两者都返回3。函数的结果是它的值。

柯里化函数很自然。

add1 = add 1
add1 2 -- also returns 3

1
你能更详细地解释一下覆盖柯里化吗? - pdexter
2
这并不准确。uncurry将返回一个函数,其中前两个参数被视为单个元组而不是“所有”参数。此外,它并没有“覆盖”柯里化,而是返回一个具有不同类型的新函数。返回的函数仍然是柯里化的。 - pdexter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接