gpt4 book ai didi

haskell - 为什么函数是 Haskell 中的第一个参数

转载 作者:行者123 更新时间:2023-12-02 11:19:00 28 4
gpt4 key购买 nike

我开始学习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) 的东西,这比(假设 flipmap = Flip map)好得多 \l -> Flipmap l incrflip Flipmap incr,但不幸的是 Haskell 不支持这种糖。接下来的事情是,在 Scala 中 map 只有一个参数,并且它“属于”某个列表,因此顺序与 Haskell 非常相似 - 区别在于客观和函数方法的哲学。

关于haskell - 为什么函数是 Haskell 中的第一个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56207121/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com