在这段代码中,我能够使用一些直接构造函数(例如Lit
和Nom
),以及整数来构建Algo
列表。这是因为Algo
继承了Num
。
对于字符串,是否也可以实现类似的功能呢?
type Nr = Double
data Algo
= Nom Nr
| Lit String
| Und
deriving (Show)
instance Num Algo where
(+) (Nom a) (Nom b)=Nom(a+b)
(+) _ _=Und
(*) (Nom a) (Nom b)=Nom(a*b)
(*) _ _=Und
abs (Nom a)=Nom(abs a)
abs _=Und
signum (Nom a)=Nom(signum a)
signum _=Und
fromInteger a=Nom(fromInteger a)
main=do
print ([1,2,3,Und,Nom 5,Lit "x"]::[Algo])
运行正常,结果如下:
[Nom 1.0,Nom 2.0,Nom 3.0,Und,Nom 5.0,Lit "x"]
期望的代码:
print (["test",1,2,3,Und,Nom 5,Lit "x"]::[Algo])
这当然会导致错误...
转换是在哪里发生的呢?在解析/编译时吗?
readPrec 也没有帮助
"test"
转换成什么样的内容? - Shoe