2012-05-13 119 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]

相关问题