Я изучаю семейства типов в Haskell, пытаясь определить сложность функций уровня типов, которые я могу определить. Я хочу определить закрытую версию mod
на уровне типа, например:
{-# LANGUAGE TypeFamilies, DataKinds, TypeOperators, UndecidableInstances #-}
import GHC.TypeLits
type family Mod (m :: Nat) (n :: Nat) :: Nat where
n <= m => Mod m n = Mod (m - n) n
Mod m n = m
Однако компилятор (GHC 7.10.2) отвергает это, поскольку ограничение в первом уравнении недопустимо. Как охранники на уровне значения переходят на уровень типа? Возможно ли это в Haskell в настоящее время?
If
? Я думаю, что где-то видел, что это использовалось, но я не специалист по библиотекам... - person chi   schedule 31.05.2016If
существует в Data.Type .Бол. - person prophet-on-that   schedule 01.06.2016Mod
, используя уровень типовIf
, который успешно скомпилировался. Однако любая попытка уменьшить термин формыMod m n
приводила к исключению переполнения стека. Настройка параметра -freduction-depth показала мне, что GHC уделяет приоритетное внимание расширениюm - n
части выражения, не понимая, что это никогда не будет возможно. Мне придется изучить расширение DataKinds, чтобы лучше понять его поведение. - person prophet-on-that   schedule 01.06.2016If
стремится ко всем своим аргументам, что выглядит неправильно. - person chi   schedule 01.06.2016