在列表中乘以字符串,Haskell

时间:2017-11-17 15:12:58

标签: haskell

我正在尝试将列表中的字符串相乘。例如,当我有一个像["hello","World"]这样的列表并且我希望将它“乘以”时,我希望最终得到["hello","hello","World","World"]

以下是我提出的建议:

rep :: Int -> [String] -> [String]
rep n [] = []
rep n [x:xs] = replicate n [x] ++ rep n [xs]

但它给了我例外:

  

(298,1) - (299,44):函数rep中的非详尽模式

我对这种语言完全陌生,我对如何解决这个问题没有任何想法。你能帮忙吗?

1 个答案:

答案 0 :(得分:1)

  • 您的第一个问题是非空列表的模式是错误的,它应该是(x:xs),而不是[x:xs]
  • 此外,replicate需要一个元素并将其转换为长度为n的列表,因此它应为replicate n x,而不是replicate n [x]
  • 类似的徒劳xs已经是一个清单。

如果你解决了所有这些问题,你最终会得到以下内容,这实际上是按照预期的方式运作的:

rep :: Int -> [String] -> [String]
rep n [] = []
rep n (x:xs) = replicate n x ++ rep n xs

也就是说,有很多不同的方法可以写出来,例如concatMap

rep n = concatMap (replicate n)

rep = concatMap . replicate