帮助我的代码有什么问题

时间:2011-03-06 15:51:46

标签: haskell

  

可能重复:
  replicate function help

decode [] = ""

decode = concatMap decodeHelper

    where

      decodeHelper (1 x)  = [x]
      decodeHelper ( n x) = replicate n x

我做了什么错了???

我有一个列表[(Char,Int)],我需要复制char,无论数字是什么,我需要把它放到一个字符串中[(Char,Int)] -> String

例如

decode ['a',9']将返回"aaaaaaaaa"

3 个答案:

答案 0 :(得分:3)

代码中存在一些语法问题。例如,使用逗号编写元组,因此decodeHelper中的模式应该看起来像(n,x),而不是(n x)。后者将被编译器解释为调用函数n,传递x作为参数,这肯定不是你的意思。

事实证明,您不需要n等于1的特殊情况。只需使用replicate 1 x即可根据需要为您提供[x]。事实证明,您的空列表的特殊情况是不必要的,因为应用于空列表的concatMap f也将产生空列表。因此,删除这些不必要的案例并清理代码,

decode = concatMap decodeHelper
  where decodeHelper (n, x) = replicate n x

另一个(稍高级)更改将是使用uncurry而不是在where子句中明确地编写decodeHelper,从而产生非常简单易读:

decode = concatMap (uncurry replicate)

答案 1 :(得分:0)

有什么问题:

decode a b = replicate a b

答案 2 :(得分:0)

您的decodeHelper有错误的呼叫签名。如果您在任何地方放入预期的函数签名,您可能会从编译器获得更好的结果,以便类型检查器可以告诉您它出错的地方。

具体来说,您的表达式(1 x)(n x)不能属于(char,int)类型,因此它们与您提供的列表中的类型不匹配。您需要(1,x)(n,x)才能使模式匹配正常工作。