2011-02-06 8 views
3

私はこの問題を最近何らかの形で大量に受けてきました。私は数xをとり、yを生成するxに高次関数の束を適用したいと言いましょう。次に、yが特定のプロパティを満たしているかどうかを確認し、そうであればxを返すようにします。高次関数によるデータの受け渡し

この問題は、数値のリスト[x1、x2..xn]と、適用する関数のリストを集約すると、本当に面倒なようです。たとえば、リスト内の要素([y1、y2 ..]を生成する)、ソート、グループの各要素に関数を適用し、次に最大のグループのxの値を返したいとします。たとえば:

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

答えは6ですが、どのように私は、どの要素番号1〜10は、これら6に属して私に教えて、このような関数を書き換えるでしょうか?

私は、sndが必要になるまで、タプルを渡してfstを使うという考え方でプレーしました。あるいは、ソートのようなものを作るために新しいクラスを書くことは、クラスの1つの要素でのみ機能します。きれいなアプローチで登場するようです。

ありがとうございました。

答えて

5

コードの長さではなく値を返す小さな変更があります。 * By機能の使用はタプルを使用する必要がありません:

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

このコードはData.ListとData.Functionが必要です。 Data.Functionにはonが含まれています。これにより、入力の一部の機能に比較(ソートまたはグループ化)を適用できます。

+0

ありがとうございます、これは私が思い付いたよりもはるかにクリーンです。私はこれらのような問題に対する一般的なアプローチはないことを理解し始めています。 –

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]] 
+0

私はその拡張子が存在していたことを知らなかった、興味深い見て、私はそれを再生し始める –

関連する問題