【发布时间】:2021-05-09 09:55:31
【问题描述】:
我正在尝试在 Haskell 中编写一个基于 String 或 Num 参数的多态函数。
我写了一些无法编译的伪代码:
numDigits strOrNum =
if isString strOrNum then length strOrNum
else isNum strOrNum then length (show strOrNum)
numDigits 1000 -- Should return 4
numDigits "1000" -- Should return 4
注意isString 和isNum 不是真正的Haskell 函数,它们只是为了演示。
来自 Lisp,strOrNum 是一个联合类型,这段代码可以运行。
我知道 Haskell 中的临时多态性需要类型类,但我不知道如何将它们组合在一起。
【问题讨论】:
-
您可以为此使用类型类,但您很快就会遇到重叠/无法确定的实例等问题,因为您想要这样做 - 我会问自己一个问题:我真的需要需要这个吗?如果是:
data MyNum = IntNum Int | StringNum String是否足够好? (如果您为该类型执行Num和IsString实例,您可以获得numDigits ..,因为您想要使用OverloadedStrings扩展