haskell - fmap 的参数太多

标签 haskell functor

第一个参数,即 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/

相关文章:

haskell - 尝试实现二叉树搜索

c++ - 使用容器中的第 n_th 个元素,但使用另一个键

c++ - C++中的函数指针与仿函数

haskell - haskell 中的函数类似于 catMaybes,但类型为 [Maybe a] -> Maybe [a]

haskell - `State#` 的规范

file - 如何将文件读入 double 向量?

c++ - 如何实现最简单的 C++ 可调用对象包装器?

c++ - G++ 中的匿名仿函数?

haskell - 在 hedis 之上构建一个 monad,一个 haskell redis 库

function - 关于 Haskell IO Monad 中的(执行时)