Haskell实现fillZeros函数报类型签名变量缺少绑定错误如何解决
错误原因
- Haskell是大小写敏感的语言,你在类型签名中声明的函数名为
fillZeros(第二个单词首字母Z大写),但后续函数实现时写的是fillzeros(第二个单词首字母z小写),二者被编译器识别为两个不同的变量,因此会提示fillZeros只有类型签名、没有绑定实现的错误。 - 除了大小写问题外,你的代码还存在其他几处语法/逻辑错误:
- 你要拼接的是字符
'0'而非整数0,输入输出类型都是字符串[Char],直接写0会出现类型不匹配错误 - 递归调用时的
a-1需要包裹括号,Haskell中函数应用优先级高于算术运算符,不加括号会被解析为(fillzeros (x:xs) a) - 1,完全不符合预期 - 输入字符串无需解构,当前的
(x:xs)匹配规则无法处理空字符串输入,且递归时不需要拆分列表 - 递归逻辑有误,你不需要把原列表拆分后重复传递,直接保留原列表传递即可
- 你要拼接的是字符
修复方案
基础递归实现
完全兼容你原有写法的修复版本:
fillZeros :: (Eq a, Num a) => [Char] -> a -> [Char] fillZeros x 0 = x fillZeros x a = '0' : fillZeros x (a-1)
测试效果和你给出的示例完全一致:
fillZeros "100" 1
"0100"
fillZeros "10" 4
"000010"
更简洁的标准库实现
你可以直接用replicate函数生成指定个数的'0',再和原字符串拼接,不需要手动写递归:
fillZeros :: String -> Int -> String fillZeros x n = replicate n '0' ++ x
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

