Haskell将String转换为自定义newtype BigNumber出现类型匹配错误怎么解决?
错误成因
- 你通过
newtype定义的BigNumber是独立的全新类型,并非[Char](即Haskell中String的本质类型)的别名,该类型的合法取值必须通过配套的值构造器Digits包裹字符列表生成,无法直接把字符串当作BigNumber类型的值使用。 - 现有代码中
scanner a = id a返回的是入参a本身,类型为String,和函数签名要求的返回值类型BigNumber不匹配,因此触发类型校验错误。
正确实现
最简实现(无输入校验)
如果不需要校验输入的字符串是否为合法数字格式,直接用Digits构造器包裹输入字符串即可:
scanner :: String -> BigNumber scanner a = Digits a
带合法性校验的实现
如果要求输入必须为合法数字字符串(支持正负号前缀),可以新增校验逻辑:
- 首先在文件头部导入字符判断工具:
import Data.Char (isDigit)
- 实现带校验的转换逻辑:
scanner :: String -> BigNumber scanner s | all isDigit s = Digits s | (head s == '+' || head s == '-') && (not $ null $ tail s) && all isDigit (tail s) = Digits s | otherwise = error "输入不是合法的数字字符串"
内容的提问来源于stack exchange,提问作者Francisca Almeida
相关产品推荐
相关产品推荐

