Ожидал тип, но у «i» есть вид «Nat»

Я хочу реализовать простую пропозициональную логику с размером интерпретации, ограниченным типом. Но каким-то образом мне не удается преобразовать числа на уровне типов в значения, используя natVal. Образец кода:

import GHC.TypeLits
import Data.Proxy

newtype PropositionalVariable (interpretationSize) = PropositionalVariable {
  getVariable :: Int
} deriving (Show, Eq)

instance KnownNat i => Enum (PropositionalVariable i) where
  fromEnum = getVariable
  toEnum e | e <= 0 = error "Variable must be positive integer"
           | (toInteger e) > (natVal (Proxy :: Proxy i)) = error "Variable index overflow"
           | otherwise = PropositionalVariable e

Выдает мне ошибки типа:

• Expected a type, but ‘i’ has kind ‘Nat’
• In the first argument of ‘PropositionalVariable’, namely ‘i’
  In the first argument of ‘Enum’, namely ‘PropositionalVariable i’
  In the instance declaration for ‘Enum (PropositionalVariable i)’

Каков правильный способ преобразования целых чисел уровня типов в значения в этом случае?


person user1747134    schedule 23.09.2016    source источник
comment
Я подозреваю, что это подразумевает interpretationSize :: *. Вам нужно включить PolyKinds или дать interpretationSize любезную аннотацию.   -  person Benjamin Hodgson♦    schedule 24.09.2016
comment
Спасибо, добавление PolyKinds помогло. :-)   -  person user1747134    schedule 24.09.2016
comment
Это должно быть помечено как решенное   -  person radrow    schedule 14.03.2019


Ответы (1)


Вам нужно включить PolyKinds расширение или дать interpretationSize добрую аннотацию.

person Community    schedule 14.03.2019