2015-05-04 141 views
3

在此代碼中,我可以使用一些直接構造函數(如LitNom)構造一個列表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都於事無補

+0

你認爲''測試''被「轉換」到了什麼程度? – Shoe

+0

自動與數字一樣點亮「測試」 –

回答

11

對於"test"被自動 「轉換」 到Algo,你需要定義的IsString一個實例,然後使用GHC擴展OverloadedStrings

instance IsString Algo where 
    fromString = Lit 

Live demo

以便以下工作正確:

print ["test", 1, 2, 3, Und, Nom 5, Lit "x"] 
-- [Lit "test",Nom 1.0,Nom 2.0,Nom 3.0,Und,Nom 5.0,Lit "x"] 
相關問題