Ich schreibe gerade einen einfachen Code in Haskell,Mehrdeutige Instanz in Haskell
coo x y = ((lim-1)*y*(y-1)`div`2) + (y*(y-1)*(sum (map (\j->(x`div`j)-j) [2..lim])))
where
lim = floor (sqrt x)
aber wenn ich 'coo 10 10' in GHCI, es gibt mir die folgende Fehlermeldung:
<interactive>:3:1:
No instance for (Floating a0) arising from a use of ‘it’
The type variable ‘a0’ is ambiguous
Note: there are several potential instances:
instance Floating Double -- Defined in ‘GHC.Float’
instance Floating Float -- Defined in ‘GHC.Float’
In the first argument of ‘print’, namely ‘it’
In a stmt of an interactive GHCi command: print it
Was passiert? Ich bin mir sicher, dass ich alle Typen richtig zuordnen kann.
Sie werden eine explizite Art Signatur für (oder innerhalb) 'coo 10 10' selbst brauchen. Um zu sehen warum, tippe ": t coo" in GHCi. Die Typen sind korrekt, aber "coo 10 10" ist immer noch polymorph. Sie müssen angeben, ob Sie 'coo 10 10 :: Float' oder' coo 10 10 :: Double' möchten. –
@Rhymoid Nope ... obwohl der Fehler darauf hinweisen würde, ist es hier nicht das Problem - versuchen Sie es: Sie werden nur einen anderen Fehler bekommen (sagen Sie 'Float' oder' Double' ist nicht 'Integral') – Carsten
' sqrt :: Floating a => a -> a'; Sie können 'sqrt (fromIntegral x)' verwenden, aber achten Sie auf Präzisionsverlust. – Ryan