3
在此代碼中,我可以使用一些直接構造函數(如Lit
和Nom
)構造一個列表Algo
,但也可以使用整數。發生這種情況是因爲Algo
派生了Num
。字符串的Haskell類型強制
是否有可能爲字符串做類似的事情?
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都於事無補
你認爲''測試''被「轉換」到了什麼程度? – Shoe
自動與數字一樣點亮「測試」 –