通过高阶函数传递数据

时间:2011-02-06 03:31:46

标签: haskell

我最近以某种形式出现了这个问题。让我们说我想取一个数字x并将一堆高阶函数应用于x生成y。然后我检查y是否满足某个属性,如果确实如此,那么我想返回x。

当我有一个数字列表[x1,x2..xn]并且我应用的函数压缩列表时,这个问题似乎变得非常棘手。例如,我将一个函数应用于列表中的每个元素(生成[y1,y2 ..]),sort,group,然后我想返回最大组的x值。例如:

head . reverse . sort . map (length) . group . sort . map (mod 4) $ [1..10]

答案是6,但是我如何重写这样的函数来告诉我哪些元素1到10属于那些6?

我已经玩过传递元组和使用fst的想法,直到需要snd,或者编写一个新的类来使它像sort这样的东西只能在类的一个元素上运行,但我似乎无法理解想出一个干净的方法

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

这是对代码的一小组更改,它们返回值而不是长度;使用* By函数可以避免使用元组:

maximumBy (compare `on` length) . groupBy ((==) `on` mod 4) . sortBy (compare `on` mod 4) $ [1..10]

此代码需要Data.List和Data.Function。 Data.Function包含on,它允许比较(用于排序或分组)应用于输入的某些功能。

答案 1 :(得分:1)

您可能对GHC TransformListComp extension感兴趣,它可以直接表达您的查询。

{-# LANGUAGE TransformListComp #-}
import GHC.Exts

input = [1..10]
output = [ x
         | x <- input
         , let y = 4 `mod` x
         , then group by y
         , then sortWith by (-length x, the y)
         ]
-- output = [[5,6,7,8,9,10],[1,2,4],[3]]
相关问题