fmap 的参数太多

Too many arguments for fmap

预期 fmap 的第一个参数是一个带有一个参数的函数。

fmap :: Functor f => (a -> b) -> f a -> f b

然后我在前奏中尝试如下:

Prelude> x = fmap (\x y -> x * y)

如您所见,fmap 的第一个参数是一个函数,它有两个参数。为什么编译器让它通过?

我传递给上面 fmap 的函数有两个参数而不是一个!

Haskell 实际上并没有多于(或少于)一个参数的函数。 "two-argument function" 实际上只是一个接受一个参数并生成另一个接受另一个参数的函数的函数。也就是说,\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] (a.k.a. [(1*), (2*), (3*)]).

定义了一个函数。函数式编程的基本方面之一,函数可以是参数,存储到变量等。

如果我们随后查询 xtype,我们得到:

Prelude> :t x
x :: (Functor f, Num a) => f a -> f (a -> a)

所以 x 现在是一个函数,它将 Functor 作为输入,a 应用于该函数 ,并且 returns 具有相同函子的类型的一个元素,但应用了 a -> a.

例如,您可以在 x 应用列表 ,例如:

Prelude> :t x [1,4,2,5]
x [1,4,2,5] :: Num a => [a -> a]

现在我们有一个函数列表,即等价到:

[\x -> 1*x, \x -> 4*x, \x -> 2*x, \x -> 5*x]