Привести к типу с несколькими параметрами в Haskell - PullRequest
3 голосов
/ 03 сентября 2011

У меня есть тип

class IntegerAsType a where
  value :: a -> Integer

data T5
instance IntegerAsType T5 where value _ = 5

newtype (Num a, IntegerAsType n) => PolyRing a n = PolyRing [a]

Мой главный вопрос: как мне определить переменную в конкретном PolyRing?

Это должно быть что-то вроде:

x = [1, 2, 3] :: Integer T5

(мне кажется) Вопрос в том, какой правильный синтаксис после ::?

Я получаю ошибку

Couldn't match expected type `PolyRing Integer T5'
         with actual type `[t0]'
In the expression: [1, 2, 3] :: PolyRing Integer T5
In an equation for `x': x = [1, 2, 3] :: PolyRing Integer T5

Также яищу лучший способ реализовать это.В частности, мне бы очень хотелось, чтобы тип a выводился из типа элементов списка, в то время как IntegerAsType n должен быть указан (он не должен зависеть от длины списка, даже если это возможно).

То, что я до сих пор пробовал:

x = [1,2,3] :: PolyRing (Integer, T5)

x = [1,2,3] :: PolyRing Integer T5

Ответы [ 2 ]

2 голосов
/ 03 сентября 2011

Первая нота

Контексты типа данных, такие как:

newtype (Num a, IntegerAsType n) => PolyRing a n = PolyRing [a]

, как правило, плохая идея, и они вышли из языка.

Игнорирование этого

Для создания экземпляра вы должны использовать конструктор данных PolyRing:

PolyRing [1,2,3]

Но этого недостаточно, вывод типа пока будет (IntegerAsType n) => PolyRing Integer n. Ваша окончательная подпись типа закончит это let x = PolyRing [1,2,3] :: PolyRing Integer T5.

Возвращаясь к первой ноте

Тем не менее, возможно, вы хотели:

newtype PolyRing a n = PolyRing [a]

И каждая функция, которая создает или использует многогранник, может применять необходимые ограничения:

func :: (Num a, IntegerAsType n) => PolyRing a n -> ...
2 голосов
/ 03 сентября 2011

A newtype - это не просто синоним, а способ создания типа, отличающегося на уровне типа (хотя позже он будет идентичен).Тем не менее, вам нужно явно обернуть его, используя ваш конструктор данных.Кроме того, контекст не имеет никакого эффекта.Вы все еще должны печатать это везде.

...