为什么Haskell中的map函数传入(-1)无法正常运行?
问题核心原因
这是Haskell语法对负号的特殊解析规则导致的,我们逐行验证给出的四行等式:
- 第一行
map (+1) [1, 2, 3 ] == map (\x -> x + 1) [1, 2, 3]完全合法,运行结果为True。(+1)是标准的运算符节,含义就是「给传入的参数加1」,和右侧匿名函数完全等价。 - 第二行
map (1+) [1, 2, 3] == map (\x -> 1 + x) [1, 2, 3]也完全合法,运行结果为True。(1+)同样是合法的运算符节,含义是「1加上传入的参数」,和右侧匿名函数等价。 - 第三行
map (-1) [1, 2, 3] == map (\x -> x - 1) [1, 2, 3]是不成立的,而且代码直接运行就会报错。Haskell语法规定(- 数值)的结构统一被解析为负数字面量,不会被识别为运算符节,也就是说(-1)就是数字-1,不是接收参数、返回参数减1的函数,给map传一个数字当第一个参数,类型不匹配自然无法运行。 - 第四行
map (1-) [1, 2, 3] == map (\x -> 1 - x) [1, 2, 3]完全合法,运行结果为True。(1-)符合运算符节的规则,含义是「1减去传入的参数」,和右侧匿名函数等价。
map (-1) [1, 2, 3] 报错的解决方案 如果你想实现「每个元素减1」的效果,可以用两种写法替代:
- 写完整的匿名函数:
map (\x -> x - 1) [1, 2, 3] - 用标准库的
subtract函数:map (subtract 1) [1, 2, 3],subtract函数的定义就是subtract a b = b - a,专门用来解决减法不能写右运算符节的问题。
内容的提问来源于stack exchange,提问作者1234
相关产品推荐
相关产品推荐

