2015-05-12 8 views
9

Оказывается, что в GHC 7.10, это нормально компилируется:Почему Haskell указывает, что бесплатная версия функции приводит к ошибке неоднозначного типа?

mysum xs = foldr (+) 0 xs 

Но это:

mysum = foldr (+) 0 

приводит к следующей ошибке:

No instance for (Foldable t0) arising from a use of ‘foldr’ 
The type variable ‘t0’ is ambiguous 
Relevant bindings include 
    mysum :: t0 Integer -> Integer (bound at src/Main.hs:37:1) 
Note: there are several potential instances: 
    instance Foldable (Either a) -- Defined in ‘Data.Foldable’ 
    instance Foldable Data.Functor.Identity.Identity 
    -- Defined in ‘Data.Functor.Identity’ 
    instance Foldable Data.Proxy.Proxy -- Defined in ‘Data.Foldable’ 
    ...plus five others 
In the expression: foldr (+) 0 
In an equation for ‘mysum’: mysum = foldr (+) 0 

Почему это происходит, и что такое понимание, которое достигается путем понимания этой разницы? Кроме того, могу ли я дать этой функции тип (который все еще является общим), чтобы эта ошибка исчезла?

+9

* Страшное ограничение -мономорфизма ударяет снова * – AJFarmar

+1

я думал , в недавнем GHC ограничение мономорфизма было отключено по умолчанию? – arrowd

+3

@arrowdodger, вы пропустили письмо: в последнее время GHCi ограничение мономорфизма отключено по умолчанию. –

ответ

11

Как обычно, в случаях, когда создание хорошо напечатанной функции без точек неожиданно приводит к ошибкам типа ошибок, связанных с невыполненными ограничениями на класс, основной причиной этого является monomorphism restriction, включенный по умолчанию.

Вы можете решить эту проблему, либо добавление сигнатуры типа для mysum:

mysum :: (Foldable f, Num a) => f a -> a 

или путем выключения ограничения мономорфизма:

{-# LANGUAGE NoMonomorphismRestriction #-} 
+0

Вот пример связанной ситуации: https: // stackoverflow. com/вопросы/6052670/ – Cactus

+0

Знак ... ограничение мономорфизма. Какое имя. – Ana

+0

@Ana: Звучит намного страшнее, чем есть, и это очень много *. И неудивительно: это произвольно и неестественно, так что это будет вас трогать, если вы не знаете об этом. Вот почему люди любят называть это суровым ограничением мономорфизма :). –