2015-04-03 96 views
1

我有一個函數列表和一個帶有「參數」的其他列表來創建一個新列表,其中一個列表中的每個元素都映射到另一個列表的另一個元素。 (申請::奧德U => [V->ü] - > [V] - > [U]) 例如,haskell中的高階函數

apply [(^2),(^3),(^4),(2^)] [10] = [100,1000,1024,10000]. or 
apply [reverse,(++"ing"),reverse.(++"ing"),(++"ing").reverse] ["play","do"] = ["doing","gniod","gniyalp","od","oding","playing","yalp","yalping"].. 

我能做些什麼,因爲我在做我的哈斯克爾的第一個步驟。 。

回答

4

讓我們把你的第一個列表:

[(^2),(^3),(^4),(2^)] 

它的類型是xs :: Integral a => [a -> a]

現在,你想將它應用到一個列表[10]。你想要的是正是應用型功能<*>,其類型爲Applicative f => f (a -> b) -> f a -> f b

λ> import Control.Applicative 
λ> let xs = [(^2),(^3),(^4),(2^)] 
λ> xs <*> [10] 
[100,1000,10000,1024] 

您可以制定出類型,看看他們是如何結合在一起的。你的第二個例子似乎並不正確,因爲你沒有向你的apply函數傳遞任何第二個參數。我建議你開始閱讀LYAH以進一步鞏固這些概念。

+0

這將適用於每個函數的每個參數,對嗎? OP想要「一個列表中的每個元素,與另一個列表中的另一個元素映射」,我認爲這可以理解爲僅應用具有第一個參數的第一個函數,等等。 – user2079303 2015-04-03 12:15:25

+1

@ user2079303我很難解析這個問題。如果這就是OP,那麼他可以將這兩個列表拉鍊,然後應用它們。但是,他當前問題的預期結果是錯誤的呢? – Sibi 2015-04-03 12:21:10

+0

我剛糾正了我的問題(第二個參數適用於我的)..現在更清楚了嗎? @sibi我想對每個函數應用每一個參數。正確 – 2015-04-03 12:28:32