Haskell填零程序。

3

这个程序会在列表x的末尾添加n个0。

fillZeros "100" 1 "0100" fillZeros "10" 4 "000010"

我的代码:

fillZeros :: (Eq a, Num a) => [Char] -> a -> [Char] 
fillzeros x 0 = x 
fillzeros (x:xs) a  = (0:fillzeros (x:xs) a-1)

类型签名中变量 "fillZeros" 缺少绑定,每次重新加载 :r 时都会出现此错误。


你的签名有一个大写的 Z,而你函数的定义有一个小写的 z。你应该修改其中一个,使得函数签名中的名称与函数体中的名称相同。 - Willem Van Onsem
我已经解决了名称,但是它给了我这个错误:"-需要(Num [Char],Num Char)的实例来定义fillZeros"。 - Peter
(0:fillzeros (x:xs) a-1)没有意义,因为你正在返回一个字符串,0不能是一个元素。 - Willem Van Onsem
1个回答

4
你遇到的第一个问题是,你为函数fillZeros(大写Z)指定了签名,但你的实现是针对函数fillzeros(小写z)。
此外,使用(0: fillzeros (x:xs) a-1)没有意义:这会被解析为(0: (fillzeros (x:xs) a) - 1),所以你从递归调用中减去了1,而且0不是一个字符,因此你不能在函数中使用它。
为了进行模式匹配,最好使用x进行匹配,否则fillzeros "" 15将引发错误,因为空字符串与(x:xs)不匹配。
因此,你可以这样实现:
fillzeros :: (Eq a, Num a) => [Char] -> a -> [Char] 
fillzeros x 0 = x 
fillzeros x a  = (<b>'0'</b> : fillzeros x <b>(</b>a-1<b>)</b>)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接