2016-04-01 3 views
0

Я просто написать простой код в 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 

Что получилось? Я уверен, что я правильно согласен со всеми типами.

+0

Вы будете нуждаться явный тип подписи для (или в) 'ворковать 10 10' сам. Чтобы узнать, почему, введите ': t coo' в GHCi. Типы верны, но 'coo 10 10' по-прежнему является полиморфным. Вам нужно указать, хотите ли вы 'coo 10 10 :: Float' или' coo 10 10 :: Double'. –

+0

@Rhymoid nope ... хотя ошибка указывает на то, что это не проблема здесь - попробуйте: вы просто получите еще одну ошибку (говоря вам, что 'Float' или' Double' не является 'Integral') – Carsten

+0

' sqrt :: Плавающий a => a -> a'; вы можете использовать 'sqrt (fromIntegral x)', но будьте осторожны с точностью потери. – Ryan

ответ

4

Если вы посмотрите внимательно (или спросите GHCI) вы увидите, что ваша функция имеет тип

coo :: (Floating a, Integral a, RealFrac a) => a -> a -> a 

говоря GHC использовать некоторый тип a, который является одновременно Floating и Integral и это будет получить сложно (нет таких типов в проигрыше)


Я не 100% уверен, что вы пытаетесь сделать, но один из способов исправить это изменить lim в:

lim = floor (sqrt $ fromIntegral x) 

это даст

λ> coo 10 10 
360 
+0

Не могли бы вы предложить, как исправить эту проблему? – CYC

+1

сделано, но я не знаю, что должна делать ваша функция. – Carsten

+0

Правильный способ - реализовать функцию [integer square root] (https://en.m.wikipedia.org/wiki/Integer_square_root). –

Смежные вопросы