Я хочу создать класс типов, для которого можно доказать, что определенный элемент является положительным, отрицательным или нулевым.Я создал интерфейс:
interface Signed t where
data Positive : t -> Type
data Negative : t -> type
data IsZero : t -> Type
Теперь я хотел бы создать реализацию для Nat
, но я не могу определить синтаксис для него.Это, например, не работает:
Signed Nat where
data Positive : Nat -> Type where
PosNat : (n : Nat) -> Positive (S n)
data Negative : Nat -> Type where
NegNat : Void -> Negative Nat
data IsZero : Nat -> Type
ZZero : IsZero Z
Я получаю not end of block
ошибку, где data Positive
стоит в реализации.Однако пропуск строки data Positive...
также не работает.Идрис говорит, что method Positive is undefined
.Итак, как мне реализовать тип внутри интерфейса?
Также, похоже, не работает следующее:
data NonZero : Signed t => (a : t) -> Type where
PositiveNonZero : Signed t => Positive a -> NonZero a
NegativeNonZero : Signed t => Negative a -> NonZero a
Со словами Идриса: Can't find implementation for Signed phTy
.Так какой же правильный синтаксис для всего этого?И, возможно, я делаю это неправильно?Я знаю о существовании Data.So
, но после нескольких экспериментов мне это кажется сложным, и я бы предпочел работать с определенными вручную доказательствами, что намного проще.Кроме того, документ для Data.So
утверждает, что он действительно должен использоваться с примитивами.