【问题标题】:Haskell Map Function type in detailHaskell Map Function 类型详解
【发布时间】:2016-05-04 15:21:13
【问题描述】:
map :: (a -> b) -> [a] -> [b]
map f xs = [f x | x <- xs]

此定义来自 Hutton 的 Programming in Haskell (p.62)。

查看它的类型,我了解该函数如何接受第一个参数是函数,第二个参数是列表。

但是上面的类型会变成(a -&gt; b) -&gt; ([a] -&gt; [b])?所以map接受函数并返回一个接受[a]并返回[f x|x &lt;- xs]?的函数

为什么是(a -&gt; b) -&gt; [a] -&gt; [b] 而不是(a -&gt; a) -&gt; [a] -&gt; [a] ?

例如本书使用map(+1)[1,3,5,7]

谁能详细解释一下这个功能?

【问题讨论】:

  • a -&gt; b 并不意味着这两种类型必须不同,只是它们可以不同。

标签: haskell functional-programming


【解决方案1】:

函数返回可以是任何其他类型,例如字符串的长度。符号

(a -> b) -> [a] -> [b]

等价于

(a -> b) -> ([a] -> [b])

一般

a -> b -> c -> d

等价于

a -> (b -> (c -> d))

您的函数 (+1) 恰好是 Num a =&gt; a -&gt; a 一个特殊情况。

【讨论】:

    【解决方案2】:

    提示: 你应该知道函数的类型遵循柯里化定律,所以是右结合。这就是我们避免或删除类型中括号的原因。

    另一方面,您在函数的类型中使用不同的字母 ([a],[b]) 来表示您将使用不同的类型进行输入或输出,它们恰好出现在哪里。

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多