Я просто написать простой код в Haskell,Неоднозначный экземпляр в 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)
, но когда я использую «воркуют 10 10» в GHCI, он дает мне следующую ошибку:
<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
Что получилось? Я уверен, что я правильно согласен со всеми типами.
Вы будете нуждаться явный тип подписи для (или в) 'ворковать 10 10' сам. Чтобы узнать, почему, введите ': t coo' в GHCi. Типы верны, но 'coo 10 10' по-прежнему является полиморфным. Вам нужно указать, хотите ли вы 'coo 10 10 :: Float' или' coo 10 10 :: Double'. –
@Rhymoid nope ... хотя ошибка указывает на то, что это не проблема здесь - попробуйте: вы просто получите еще одну ошибку (говоря вам, что 'Float' или' Double' не является 'Integral') – Carsten
' sqrt :: Плавающий a => a -> a'; вы можете использовать 'sqrt (fromIntegral x)', но будьте осторожны с точностью потери. – Ryan