map :: (a -> b) -> [a] -> [b]
map f xs = [f x | x <- xs]
这个定义来自Hutton的Haskell编程(第62页)。
查看它的类型,我理解该函数如何获取作为函数的第一个参数和作为列表的第二个参数。
但是上面的类型是(a -> b) -> ([a] -> [b])?
,所以map接受函数并返回一个带[a]
并返回[f x|x <- xs]?
的函数
为什么(a -> b) -> [a] -> [b]
代替(a -> a) -> [a] -> [a] ?
例如,本书使用map(+1)[1,3,5,7]
有人可以详细解释这个功能吗?
答案 0 :(得分:5)
函数return可以是任何其他类型,例如字符串上的长度。符号
(a -> b) -> [a] -> [b]
相当于
(a -> b) -> ([a] -> [b])
一般
a -> b -> c -> d
相当于
a -> (b -> (c -> d))
您的函数(+1)
恰好是Num a => a -> a
特例。
答案 1 :(得分:0)
提示: 您应该知道函数的类型遵循currying定律,因此是右关联的。这就是我们避免或删除类型中括号的原因。
另一方面,您在函数类型([a],[b])中使用不同的字母来表示您将使用不同的类型进行输入或输出,它们恰好出现在哪里。