You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

带合法性校验的实现

如果要求输入必须为合法数字字符串(支持正负号前缀),可以新增校验逻辑:

  1. 首先在文件头部导入字符判断工具:
import Data.Char (isDigit)
  1. 实现带校验的转换逻辑:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:54:10