2011-02-06 147 views
3

我一直在以某種形式或其他形式出現這個問題。讓我們說我想要一個數字x並將一系列高階函數應用於x產生y。然後我檢查y是否滿足某個屬性,如果是,那麼我想返回x。通過高階函數傳遞數據

這個問題似乎變得非常棘手,當我有一個數字[x1,x2..xn]列表和我申請的函數縮合列表。例如,我將函數應用於列表中的每個元素(生成[y1,y2 ..]),排序,組,然後我想返回最大組的x值。例如:

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

答案是6,但我會如何改寫這樣的功能,告訴我哪些元素號1至10屬於這6個?

我已經玩過了傳遞元組並使用fst的想法,直到需要snd爲止,或者編寫一個新類來使它像sort一樣只能在類的一個元素上工作,但是我不能似乎拿出一個乾淨的辦法

感謝您的幫助。

回答

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

謝謝,這看起來比我想象的要乾淨得多。我開始明白,沒有像這樣的問題的一般方法。 – 2011-02-07 04:52:36

1

您可能感興趣的GHC's 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

我不知道這個擴展名存在,看起來很有趣,我會開始玩它 – 2011-02-08 00:17:37