首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么函数是Haskell中的第一个参数

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

Stack Overflow用户
提问于 2019-05-19 19:00:24
回答 1查看 482关注 0票数 3

我开始学习Haskell。我很好奇为什么在Haskell中,该函数被用作列表的高阶函数的第一个参数。例如,下面是map的定义

代码语言:javascript
复制
map :: (a -> b) -> [a] -> [b]

这意味着我可以以前缀或操作符的形式使用它,如下所示:

代码语言:javascript
复制
-- 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中,同样的代码可以写成:

代码语言:javascript
复制
List(1,3,5) map (_ + 2)
// we can chain as follows:
List(1,3,5) map (_ + 2) filter (_ < 4)

所以顺序颠倒了,我们把函数作为第二个参数。Haskell中参数排序的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-19 20:11:59

这只是一个惯例。在大多数情况下,这种顺序比相反的顺序更有用,因为通常在Data.List库中,您更希望使用允许您“转换给定列表”的实用程序,而不是“描述如何转换某些固定列表”。

检查这种情况:

代码语言:javascript
复制
f :: [Int] -> [Int]
f = map (+1)

在这里,f是一个递增任何Int列表中所有元素的函数。它可以被称为incrAll,它听起来比

代码语言:javascript
复制
g :: (Int -> a) -> [a]
g f = map f [1,2,3] 

它被修复为在这个特定的[1,2,3]列表上工作。当然,它可能会有一些用处,但通常不太可能。单应用之后的f仍然是一个“在列表上工作”的函数。

据我所知,你可能会写一些像f = _.map(incr)这样的东西,它比(假设使用flipmap = flip map) \l -> flipmap l incrflip flipmap incr要好得多,但不幸的是,Haskell不支持这种糖。下一件事是,在Scala中,map只有一个参数,并且它“属于”某个列表,所以顺序与Haskell非常相似-区别在于目标和函数方法的哲学。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56207121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档