【发布时间】:2019-05-19 11:00:24
【问题描述】:
我开始学习 Haskell。我很好奇为什么在 Haskell 中该函数被用作列表的高阶函数的第一个参数。例如这里是map的定义:
map :: (a -> b) -> [a] -> [b]
这意味着我可以像这样以前缀或运算符形式使用它:
-- yields [3,5,7]
map (+ 2) [1,3,5]
-- we can chain like that
filter (< 4) (map (+ 2) [1,3,5])
-- or in operator form
(+ 2) `map` [1,3,5]
(< 4) `filter` ((+ 2) `map` [1,3,5])
在 Scala 中也可以这样写:
List(1,3,5) map (_ + 2)
// we can chain as follows:
List(1,3,5) map (_ + 2) filter (_ < 4)
所以顺序颠倒了,我们将函数作为第二个参数。 Haskell 中参数排序的原因是什么?
【问题讨论】:
-
squareList = map (**2)。您可以“升级”功能以处理列表。那有什么不方便的? -
map也是fmap。fmap通常被认为是“升级”函数以使用特殊类型(函子)。 -
@IzbassarTolegen 理由是非常方便。
-
@IzbassarTolegen 实际上,对于 Haskell 中的许多函数,它们的参数顺序的唯一原因是方便。有关参数顺序的更多详细信息,请参阅HaskellWiki、this SO answer 和 this answer。
-
在 Scala 中,函数不是
map的第二个参数 - 它是map的唯一参数。该函数不能位于方法名称的左侧,因为这样您将在函数对象上调用map,而不是在列表中,并且函数没有名为map的方法。
标签: haskell functional-programming