Haskell 我的代码有什么问题
可能重复:Haskell 我的代码有什么问题,haskell,Haskell,可能重复: 我所做的有什么不对 我有一个列表[(Char,Int)],我需要按数字复制Char,我需要将它放入一个字符串中,所以[(Char,Int)]->string 比如说 decode['a',9']将返回“aaaaaaaaaaa”有什么问题: decode a b = replicate a b ?代码中存在一些语法问题。首先,元组是用逗号编写的,因此decodeheloper中的模式应该像(n,x),而不是(nx)。编译器将后者解释为调用函数n,将x作为参数传递,这当然不是您的意思
我所做的有什么不对 我有一个列表
[(Char,Int)]
,我需要按数字复制Char,我需要将它放入一个字符串中,所以[(Char,Int)]->string
比如说
decode['a',9']
将返回“aaaaaaaaaaa”
有什么问题:
decode a b = replicate a b
?代码中存在一些语法问题。首先,元组是用逗号编写的,因此
decodeheloper
中的模式应该像(n,x)
,而不是(nx)
。编译器将后者解释为调用函数n
,将x
作为参数传递,这当然不是您的意思
事实证明,n
等于1
不需要特殊情况。只需使用replicate 1x
即可获得所需的[x]
。它还证明了空列表的特殊情况是不必要的,因为应用于空列表的concatMap f
也会产生空列表。因此,删除这些不必要的案例并清理代码,您就可以
decode = concatMap decodeHelper
where decodeHelper (n, x) = replicate n x
另一个(稍微高级一点的)变化是使用uncurry
而不是在where子句中显式写入decodeheloper
,从而产生非常简单易读的:
decode = concatMap (uncurry replicate)
您的
decode助手
具有错误的呼叫签名。如果在每个地方都输入期望的函数签名,那么编译器可能会得到更好的结果,这样类型检查器就可以告诉您哪里出错了
具体来说,您的表达式
(1 x)
或(nx)
的类型不是(char,int)
,因此它们与您输入的列表中的类型不匹配。您需要将它们设置为(1,x)
和(n,x)
,才能使模式匹配真正起作用。您想做什么,以什么方式做不到?不要只说“它不工作”,我们需要更多的信息。相同用户的副本:。在这三个中,这个头衔最差。你知道,你可以编辑你的问题。根据阿桑的描述,这实际上不行——他需要类似于decode=concatMap(uncurry replicate)
的东西。
decode = concatMap (uncurry replicate)