-- Remove entries which have the same name as someone else
nubBy ((==) `on` getName) someList
-- Insert into a list sorted by salary, preserving the ordering
insertBy (compare `on` getSalary) newEmployee employees
-- Find the student with the highest grade
maximumBy (compare `on` getGrade) myStudents
作为对现有答案的补充,从一些理论家的Angular 来看,Haskell的Data.Function.on是一些人称之为psi combinator的实现。引用Smullyan <$: 一只psi鸟是一只满足以下条件的鸟: [2] Raymond M. Smullyan,To mock a mockingbird,Oxford University Press,2000.
3条答案
按热度按时间s3fp2yjn1#
假设我们有一个有两个参数的函数
f
,我们需要一个类似的函数来充当f
,但只有在它的两个参数都被另一个函数g
修改之后。我们可以重新定义
字符串
或者利用
on
,型
很好,后者可以直接使用,而不需要定义新的符号
new_f
。(使用lambda也是可行的,但没有那么好)这通常与
compare
一起使用,compare
是一个库二进制函数,用于检查其两个参数之间的顺序。型
根据不同的标准进行排序。上面,我们假设
name
等是可以从人中提取相关信息的函数。(In更现代的Haskell,我们也有
sortBy (comparing age) somePeopleList
,甚至sortOn age somePeopleList
用于相同的任务)xkrw2x1b2#
on
的类型签名是字符串
而且,实际上,这个函数只有一个合理的(非底部)实现。
型
或者,像GHC源代码中那样用中缀参数编写,
型
所以函数的主体相当简单。问题是:我们为什么要关心。
根据我的经验,
on
最常见的用例是用compare
扩充排序或比较函数。在Python中,如果我们想根据人名对一个人的列表进行排序,我们可以这样写:
型
Haskell的
sortBy
采用一个比较函数进行排序,所以我们在Haskell中编写相同的函数,如下所示:型
但那只是
on
。所以实际上型
“按名称比较排序”。它实际上读起来 * 几乎 * 像英语。
现在,特别是对于排序来说,这种范例非常常见,以至于最近的Haskell版本提供了
sortOn
,它接受Python风格的key参数型
但是有一个完整的“By”函数集合可以在列表上工作,Haskell开发人员并没有为每个函数编写“On”变体。
以下是一些示例:
型
因此,通常,
on
将与名称以“By”结尾的函数一起使用。cetgtptt3#
作为对现有答案的补充,从一些理论家的Angular 来看,Haskell的
Data.Function.on
是一些人称之为psi combinator的实现。引用Smullyan <$:一只psi鸟是一只满足以下条件的鸟:
[2] Raymond M. Smullyan,To mock a mockingbird,Oxford University Press,2000.
相关
on
function be generalized to work with n-ary functions?的