第一个参数,即 fmap
预期是一个带有一个参数的函数。
fmap :: Functor f => (a -> b) -> f a -> f b
然后我在前奏中尝试如下:
Prelude> x = fmap (\x y -> x * y)
如您所见,fmap
的第一个参数是一个函数,它有两个参数。为什么编译器会让它通过?
我传递给上面的 fmap
的函数有两个参数,而不是一个!
最佳答案
Haskell 实际上并不存在带有多于(或少于)一个参数的函数。 “双参数函数”实际上只是一个接受一个参数并生成另一个接受另一个参数的函数的函数。也就是说,\x y -> x * y
只是 \x ->\y -> x * y
的语法快捷方式。这个概念称为柯里化(Currying)。
所以这应该可以解释您的示例中发生的情况。您的 fmap
只会将数字的 f
转换为函数的 f
。例如,x [1,2,3]
将生成列表 [\y -> 1 * y,\y -> 2 * y,\y -> 3 * y]
(又名 [(1*), (2*), (3*)]
)。
关于haskell - fmap 的参数太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45038277/