Почему я получаю ошибку «неоднозначная переменная типа» здесь? - PullRequest
2 голосов
/ 03 октября 2011
import Data.Monoid

times :: Monoid a => Int -> a -> a
times i = mconcat . replicate i

main =
  print $ times 5 5

Этот код выдает следующую ошибку:

Ambiguous type variable `a0' in the constraints:
  (Monoid a0) arising from a use of `times'
              at :7:11-15
  (Show a0) arising from a use of `print'
            at :7:3-7
  (Num a0) arising from the literal `5'
           at :7:19
Probable fix: add a type signature that fixes these type variable(s)
In the second argument of `($)', namely `times 5 5'
In the expression: print $ times 5 5
In an equation for `main': main = print $ times 5 5

Почему выдает эту ошибку? Как Num вообще здесь задействован?

1 Ответ

5 голосов
/ 03 октября 2011

Проблема в том, что для чисел определены два моноида.Один с сложением, а другой с умножением.Они реализованы как экземпляры для новых типов Sum и Product, и вы должны указать, какой из них вам нужен, поскольку для простых числовых типов нет моноидных экземпляров.

*Main> times 5 (Sum 5)
Sum {getSum = 25}
*Main> times 5 (Product 5)
Product {getProduct = 3125}

Num isупоминается потому, что 5 является полиморфным значением:

*Main> :t 5
5 :: Num a => a

Это обычно приводит к неоднозначным ошибкам типов повсюду, если не для тип по умолчанию , что заставляет компилятор проходитьнабор типов по умолчанию (обычно Integer и Double), и выберите первый, который подходит.Поскольку ни Integer, ни Double не имеют экземпляра Monoid, тип по умолчанию не выполняется, и вы получаете неоднозначную ошибку типа.

Также возможно, что вы намеревались использовать список моноидов, так как это не ясноот вопроса, какого результата вы ожидали.

*Main> times 5 [5]
[5,5,5,5,5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...