2011-02-26 66 views
0

我正在尋找下面的一些有吸引力的Haskell語法在列表中爲每個參數映射一個函數

我有一個需要4個參數的函數。

F A B C d =東西

我想提供一個列出了每個參數並取回每個組合的結果列表。

本質上是一個嵌套的地圖功能。

我倒像應該有一個優雅的解決方案。但是,我還沒有發現任何可以編譯的東西。

+2

我不確定你想要什麼。請你能展示一些例子的輸入和輸出嗎? – 2011-02-26 08:43:56

+2

你能改說嗎?你在找zip4嗎?或zipWith4?你正在尋找的功能的類型是什麼? – Xoltar 2011-02-26 08:46:08

回答

6

你的問題不是很清楚:做你想做的所有可能組合(以從第一個列表中的任何a,從第二等的任何b)或處理列表並行又名拉鍊(每個列表的第一個元素時,第二個元素等)。

既可以很好地解決了應用性函子:

Prelude> let f a b c d = (a,b,c,d) 
Prelude Control.Applicative> :m +Control.Applicative 
Prelude Control.Applicative> f <$> [1,2] <*> [3,4] <*> [5,6] <*> [7,8] 
[(1,3,5,7),(1,3,5,8),(1,3,6,7),(1,3,6,8),(1,4,5,7),(1,4,5,8),(1,4,6,7),(1,4,6,8),(2,3,5,7),(2,3,5,8),(2,3,6,7),(2,3,6,8),(2,4,5,7),(2,4,5,8),(2,4,6,7),(2,4,6,8)] 
Prelude Control.Applicative> getZipList $ f <$> ZipList [1,2] <*> ZipList [3,4] <*> ZipList [5,6] <*> ZipList [7,8] 
[(1,3,5,7),(2,4,6,8)] 
+0

當涉及到純語法時,請參閱http://personal.cis.strath.ac.uk/~conor/pub/she/idiom.html。 – barsoap 2011-02-26 10:15:46

+0

我想OP是詢問其中的第一個,這恰好是我最喜歡的List應用實例的用法。 – 2011-02-26 12:30:58

+1

第二個選項有一個普通的功能:zipWith4 f [1,2] [3,4] [5,6] [7,8] – 2011-02-27 00:14:28

0

我覺得我得到你在找什麼:

fourway˚F爲BS CS DS =地圖(curry4 F) [ (r,s,t,u)| ř< - 如,S < - BS,T < - CS中,u < - DS]
其中 curry4 F(A,B,C,d)= fabcd

你可以這樣做點自由和可愛,但我認爲這是你想要的,更容易閱讀。

相關問題