Ожидаемый тип, но 'Num a' имеет вид 'GHC.Prim.Constraint'

haskell types ghc

5431 просмотра

1 ответ

1930 Репутация автора

Я пытаюсь взять полиномиальное представление в виде списка (например, [3, 2, 1] равно 3x ^ 2 + 2x + 1) и оценить его, выполнив команду apply для полинома и число для x. Полином должен быть оценен для х.

Это мой код:

newtype Poly a = P [a]

apply :: Num a => Poly a -> Num a -> Num a
apply (P p) x = if (i > 0) then (x * ((head p) ^ i)) + (apply (P (tail p)) x) else p
    where  i = length p

Проблема в том, что когда я пытаюсь скомпилировать этот код, я получаю ошибку, которую не понимаю:

Ожидаемый тип, но у 'Num a' есть вид 'GHC.Prim.Constraint'
В сигнатуре типа для 'apply':
apply :: Num a => Poly a -> Num a -> Num a

Автор: Marcus Ruddick Источник Размещён: 18.07.2016 03:57

Ответы (1)


8 плюса

9971 Репутация автора

Решение

Когда ты пишешь

apply :: Num a => Poly a -> Num a -> Num a

первый экземпляр Num a- это ограничение, которое означает, что тип aдолжен соответствовать Numклассу типов. Однако, как только вы указали это ограничение один раз, вам не нужно делать это снова. Проблема в том, что вы используете ограничение Num a еще пару раз в этой строке, когда вам просто нужно использовать тип a . Чтобы решить вашу проблему, измените тип applyна следующий:

apply :: Num a => Poly a -> a -> a

Неформально говоря, вещи между сигнатурой типа ::и =>внутри нее являются ограничениями, а вещи справа =>должны быть типами. (Обратите внимание, что некоторые сигнатуры типов не включают никаких ограничений, в этом случае они также не будут включать =>разделитель.)

Автор: bdesham Размещён: 18.07.2016 04:04
Вопросы из категории :
32x32