2015-05-06 6 views
1

Я получаю эту ошибку:Использование скобок в Haskell

<interactive>:145:29: 
    Could not deduce (Integral ([a0] -> Int)) 
     arising from a use of ‘fromIntegral’ 
    from the context (Num ([a] -> a), Fractional a) 
     bound by the inferred type of 
       meanList :: (Num ([a] -> a), Fractional a) => [a] -> a 
     at <interactive>:145:5-50 
    The type variable ‘a0’ is ambiguous 
    In the second argument of ‘(/)’, namely ‘(fromIntegral length x)’ 
    In the expression: (sum x)/(fromIntegral length x) 
    In an equation for ‘meanList’: 
     meanList x = (sum x)/(fromIntegral length x) 

Выше ошибка генерируется:

Однако при обновлении это:

let meanList x = sum x/fromIntegral (length x) 

Тогда все хорошо.

Как скобки работают в Haskell?

+1

Это не проблема с круглыми скобками, а с функциональным приложением. – AJFarmar

+0

Если вы сомневаетесь, добавьте '$': 'fromIntegral $ length x' - это то же самое, что' fromIntegral (length x) ', но вам не нужно отслеживать, где должна быть закрывающая скобка. – 9000

ответ

13

Функциональное применение левое ассоциативное. Другими словами,

fromIntegral length x = (fromIntegral length) x 

Следовательно, ошибка Could not deduce (Integral ([a0] -> Int)), так как тип длины действительно не экземпляр Integral.

+0

спасибо, сэр! для чего вы используете haskell? –

+4

@Yuck Вы можете поймать меня на freenode как srhb, поскольку я не думаю, что это подходящее место для такого разговора. Также: Все. :) – Sarah

+1

@Yuck, какой странный вопрос: o – Carsten

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