【发布时间】:2019-11-17 00:12:27
【问题描述】:
fmap 的第一个参数是一个带有一个参数的函数。
fmap :: Functor f => (a -> b) -> f a -> f b
然后我在前奏中尝试如下:
Prelude> x = fmap (\x y -> x * y)
如您所见,fmap 的第一个参数是一个函数,它有两个参数。为什么编译器让它通过?
上面我传递给fmap的函数有两个参数,不是一个!
【问题讨论】:
-
因为在 Haskell 中,所有函数都被认为是 curried
-
这是对 arity 的抽象,这对于支持一流函数的语言是可能的。您不必关注多参数函数的数量,而必须关注函数序列。
-
这实际上是在应用程序的 Haskell 中很常见的事情。
f <$> x <*> y表示fmap f x <*> y。例如,(*) <$> [2, 3] <*> [5, 7]表示[(2 *), (3 *)] <*> [5, 7],其计算结果为[2 * 5, 2 * 7, 3 * 5, 3 * 7]或[10, 14, 15, 21]。