2012-02-07 120 views
2

我是Haskell的新手,我有以下問題。我必須創建一個數字列表[f1,f2,f3 ...],其中fi x = x^i。然後,我必須創建一個將fi應用於數字列表的函數。例如,如果我有一個列表lis = [4,5,6,7..]輸出將是[4^1, 5^2,6^3, 7^4...]。這是我至今寫:哈斯克爾映射函數列表

powers x= [x^y |y<-[1,2,3,4]] 

list = [1,2,3,4]

match :: (x -> xs) -> [x] -> [xs] 
match f [] = [] 
match f (x:xs) = (f x) : (match f xs) 

所以,如果我把名單= [1,2,3]輸出爲[1,1,1,1] [2,4,8,16],[3,9,27,81]而不是[1,4,27]

你能告訴我什麼是錯的,並指向正確的方向嗎?

回答

6

第一個問題是powers的類型是Int -> [Int]。我想,你真正想要的是[Int -> Int]類型的東西 - Int -> Int函數的列表,而不是函數,它需要一個Int並返回一個Int的列表。如果定義powers像這樣:

powers = [(^y) | y <- [1..4]] 

可以使用zipWith每個電源應用到其相應的元素列表,像這樣:

zipWith ($) powers [1,2,3] -- returns [1,4,27] 

($)應用其左(第一)參數它的權利(第二)論點。在使用powers這裏定義將返回列表的長度限定爲4。如果你希望能夠使用任意長度列表

注意,你想powers無限列表,像這樣:

powers = [(^y) | y <- [1..]] 

當然,作爲dave4420指出,一個更簡單的方法是簡單地使用

zipWith (^) [1,2,3] [1..] -- returns [1,4,27] 
+3

或'zipWith(^)list [1 ..]'。 – dave4420 2012-02-07 17:42:13

+0

嘿 - 這就是我模仿OP的設計所得到的結果 – Retief 2012-02-07 18:03:50

3

您的match是標準功能map的另一個名稱。您需要使用zipWith(您可以將其視爲並排映射到兩個列表)。

這功課嗎?

+0

不,這不是功課。我正在尋找在haskell excercises,我發現它,我想我可以試試看,因爲我正在嘗試學習haskell。我會嘗試zipWith謝謝你。 – Newbie 2012-02-07 16:30:20

1

您目前正在爲每個輸入值創建一個列表。 你需要做的是遞歸地計算合適的 功率爲每個輸入值,像這樣的內容:

match f [] = [] 
match f (x:xs) y = (f x y) : (match f xs y+1) 

然後,你可以叫這個爲match pow [1, 2, 3] 1。 這相當於使用zipWith並提供了所需的功能(pow),您的輸入列表([1, 2, 3])和指數列表(從惰性列表到無限列表)作爲參數。