2010-05-18 8 views
18

Betrachten Sie dieses Beispiel zu geben:Haskell: Einschränkungen Säumigen

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 

Die 3 in applyThrice von GHC zu einem Integer wie gezeigt vorbelegt ist, wenn sie mit -Wall Kompilieren:

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

Also ich denke, dass Integer ist die Standardeinstellung Integral a => a.

  • Gibt es eine Möglichkeit, "Standardtypen" auch für andere Bedingungen zu definieren?
  • Verwendet Standardtypen schlechte Praxis? (Es beschwert sich, wenn -Wall mit ..)

Antwort

14

Ja, you can, obwohl ist es nicht ganz so einfach, wie eine Standard pro typeclass Zugabe, und es funktioniert nur für Num und ihre Unterklassen in den Prelude und Standardbibliotheken. Die Syntax lautet default (t1, ..., tn), und nur eine solche Deklaration kann pro Modul verwendet werden.

Wenn Sie beispielsweise default (Int) hinzufügen, wird der Standardwert für Integral in Ihrem Code in Int geändert.

Die Standardeinstellung (Integer, Double) ist nicht nur eine GHC-Richtlinie: Sie stammt aus der Haskell 98 Report. (GHCi hat aber extended default rules, obwohl.)

Hier ist von einigen der Probleme mit dem aktuellen System.