對於沒有爲這個問題提出一個好的標題,我表示歉意。我在表達我需要的東西時遇到了一些麻煩。在Haskell中我有一個簡單的問題,我想知道最好的解決方法是什麼。Haskell中的函數設計模式
比方說,我有一個數字列表:[-3,2,1,2]
。我想返回絕對值最高的值。也就是說,我想返回-3。所以,我想:
f = maximum . map abs
的問題,當然,這將返回計算值(3),而不是原來的值(-3)。
我可以找出一種方法做到這一點,也許將原始列表映射到(originalValue,calculatdValue)的元組,找到其函數返回snd的元組(最大值),然後返回該元組的fst。
但是,對於這樣一個簡單的問題,這看起來像很多「管道」,我不知道是否有一些我錯過的抽象解決了這個問題。也就是說,這是我一直在做的一般程序,我想要一些整潔的做法:
- 我想要一個項目列表。
- 我想將它們映射到某個值(比方說絕對值)
- 然後我想根據一些標準(假設我想要最大值或最小值)選擇一個值。
- 但是接下來我想返回原來的的值。 (如果列表是
[-3,2,1,2]
,我想返回最高絕對值,那麼我會返回-3)。
是否有這樣的庫函數?有沒有一個函子或monad這個?
我想我要與簽名功能:
f :: ([b] -> b) -> (a -> b) -> [a] -> a
即
f maximum abs [-3,2,1,2]
這種感覺很 「functory」 對我來說也許 「一元」。
或等價:'maximumBy(比較ABS)' – interjay 2011-04-01 19:37:37
我更喜歡使用'on',因爲它可以和其他東西一起工作,例如,nubBy((==)''abs')。 – augustss 2011-04-01 19:44:52
謝謝你的解決方案!有一個maximumBy和一個minimumBy。有沒有findFirstBy?我想有很多函數把一個a變成一個b(abs),然後有很多函數把b變成b(最大)。我試圖找到一種方法來編寫它們,而不需要烹飪它。 – 2011-04-01 20:10:43