haskell - 为什么函数是 Haskell 中的第一个参数
问题描述
我开始学习 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中参数排序的原因是什么?
解决方案
这只是一个约定。在大多数情况下,此顺序比相反的顺序更有用,因为通常从Data.List
库中您宁愿期望实用程序允许您“转换给定列表”而不是“描述如何转换某些固定列表”。
检查这种情况:
f :: [Int] -> [Int]
f = map (+1)
这f
是一个递增任何Int
列表的所有元素的函数。它可以被调用incrAll
,听起来比
g :: (Int -> a) -> [a]
g f = map f [1,2,3]
这是固定在这个特定的[1,2,3]
列表上工作的。当然,它可能会找到一些用途,但一般来说不太可能。f
在单个应用程序之后仍然是“适用于列表”的功能。
我知道 Scala 你可能会写一些比(假设)或f = _.map(incr)
更好的东西,但不幸的是 Haskell 不支持这种糖。接下来的事情是,在 Scala中只有一个参数并且它“属于”某个列表,因此顺序与 Haskell 非常相似——不同之处在于目标方法和函数方法的哲学。flipmap = flip map
\l -> flipmap l incr
flip flipmap incr
map
推荐阅读
- function - 如何在带有日期条件的 Google 表格中使用查询和导入范围?
- reactjs - 如果组件不包含在特定的父组件中,则显示警告
- python - 从 Python Dataframe 中的列中删除 /N 字符
- reactjs - 在 Material-UI TextField 上禁用浏览器自动完成
- javascript - 在方法中制作json数组
- python - Groupby 使用参数应用/转换自定义函数 Pandas
- retrypolicy - 在重试场景中,客户端是否可以在第二次尝试重试后从第一次尝试中获取响应?
- sql-server - 使用 SqlPackage 提取 DB 导致“用户“someUser”登录失败”
- java - 如何在 Windows 上 JPackage RPM/PKG/DEB?
- spring-boot - spring cloud openfeign映射不起作用