Я хочу реализовать простую пропозициональную логику с размером интерпретации, ограниченным типом. Но каким-то образом мне не удается преобразовать числа на уровне типов в значения, используя 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)’
Каков правильный способ преобразования целых чисел уровня типов в значения в этом случае?
interpretationSize :: *
. Вам нужно включитьPolyKinds
или датьinterpretationSize
любезную аннотацию. - person Benjamin Hodgson♦   schedule 24.09.2016