2010-05-18 44 views
18

考慮這個例子:Haskell中:違約約束鍵入

applyKTimes :: Integral i => i -> (a -> a) -> a -> a 
applyKTimes 0 _ x = x 
applyKTimes k f x = applyKTimes (k-1) f (f x) 

applyThrice :: (a -> a) -> a -> a 
applyThrice = applyKTimes 3 

applyThrice3由GHC默認爲一個Integer所示與-Wall編譯時:

Warning: Defaulting the following constraint(s) to type 'Integer' 
     'Integral t' 
      arising from a use of 'applyKTimes' 

所以我想這Integer是默認Integral a => a

  • 有沒有辦法爲其他約束定義「默認類型」?
  • 正在使用默認類型的不良做法? (它使用-Wall時抱怨..)

回答

14

是,you can,雖然它不是向每一個類型類默認這麼簡單,它僅適用於Num及其子類在Prelude和標準庫。語法爲default (t1, ..., tn),每個模塊只能使用一個這樣的聲明。

例如,將default (Int)添加到您的代碼中會將Integral的默認值更改爲Int

缺省默認值(Integer, Double)不僅僅是GHC策略:它來自Haskell 98 Report。 (雖然GHCi確實有extended default rules

這裏是a discussion的一些與當前系統有關的問題。