2016-07-19 11 views
1

ich die Typdeklaration deklariert, indem es von GHCI Überprüfung aber Laden des Moduls gibt Fehler:Könnte erwarteten Typ nicht überein ‚a‘ mit den tatsächlichen Typ ‚Double‘:

even-fibbanaci-sum.hs:7:12: error: 
    Couldn't match expected type ‘a’ with actual type ‘Double’ 
    ‘a’ is a rigid type variable bound by 
     the type signature for: 
     getFib :: forall b a. (Integral b, Floating a) => b -> a 
     at even-fibbanaci-sum.hs:4:12 
    In the expression: ((phi^n) - (minusphi^n))/sqrt 5 
    In an equation for ‘getFib’: 
     getFib n = ((phi^n) - (minusphi^n))/sqrt 5 • Relevant bindings include 
     getFib :: b -> a (bound at even-fibbanaci-sum.hs:5:1) 

Hier ist mein Code

phi = (1 + sqrt 5)/2 
minusphi = (1 - sqrt 5)/2 

getFib :: (Integral b,Floating a) => b -> a 
getFib n = ((phi^n) - (minusphi^n))/sqrt 5 

fibSum :: (Integral b,Floating a) => b -> a 
fibSum x =sum $ map getFib [2,5..x] 

aber wenn es in Ghci funktioniert es gut.

Antwort

7

Dies ist ein Beispiel für die monomorphism restriction.

Wenn Sie eine Datei in ghci laden oder mit ghc kompilieren, ist die Monomorphie-Einschränkung aktiviert, was bedeutet, dass Sie bestimmte Standardregeln für Typinferenz erhalten. In diesem Fall sagt Haskell, dass phi und minusphi den Typ Double anstelle von Floating a => a haben, was Sie wollten.

In ghci selbst ist die Monomorphie-Einschränkung jedoch nicht aktiviert, so dass die allgemeinsten Typen sind.

dies oben in Ihrem Beispiel zu beheben, fügen Sie einfach die explizite Typ Anmerkung:

phi, minusphi :: Floating a => a 
phi = (1 + sqrt 5)/2 
minusphi = (1 - sqrt 5)/2 

Here's eine vorherige Frage, die IMO eine bessere Antwort hat.

Verwandte Themen