2012-05-13 116 views
2
concatr ::Integer -> [[Integer]] -> [[Integer]] 
concatr x (y) = [x] : y 
concatr x (y:ys) = concatr x y: concatr x ys 

我試過這麼多的組合,我的頭開始受傷。我究竟做錯了什麼?我只想要一個整數放入傳入列表的每個子列表中。追加一個元素到列表中的每個子列表的開頭

+0

請注意,對於發佈的「解決方案」,第一個模式總是匹配('concatr x(y)== concatr x y'),所以這總是等於'[[x],rest或原始列表]'。您必須解構原始列表,如您在第二種情況下所做的那樣(但未使用'(x:y)'而不是'concatr x y')並終止於空案例'concatr x []'。 –

+0

對不起,在提到問題中提出的代碼時,我說「發佈的解決方案」。這可能令人困惑。 –

回答

8

您可以使用map函數。

concatr :: Integer -> [[Integer]] -> [[Integer]] 
concatr x ys = map (x:) ys 

埃塔減少了簡潔的解決方案:

concatr x = map (x:) 
+1

我讓答案更自由一些。 – pmr

+0

謝謝。這並不意味着它聽起來像有一個獨特的解決方案! – rotskoff

+5

你可以直接進入'concatr = map。 (:)'爲一個完全無點(無點?)風格的函數! – ScottWest

0

如果你想避免map

concatr :: Integer -> [[Integer]] -> [[Integer]] 
concatr x []  = [] 
concatr x (y:ys) = (x:y):concatr x ys 

兩種情況:

  • 如果該列表是空的,我們返回一個空的列表。
  • 如果列表爲y:ys,則新頭爲x:y,我們在其餘部分遞歸調用concatr

例如:concatr 1 [[0],[2]][[1,0],[1,2]

相關問題