Экземпляр семейства данных незаконно привязан к встроенному синтаксису: ()

Я пытаюсь определить семейство типов данных, один из параметров которого приводит к типу пустой кортеж (), но он не компилируется. Вот минимальный рабочий пример:

{-# LANGUAGE TypeFamilies #-}

data family F a
data instance F Int = ()

Выдаваемая ошибка компилятора говорит: «Недопустимая привязка встроенного синтаксиса: ()». Почему я получаю эту ошибку, хотя я не пытаюсь изменить определение (), а скорее устанавливаю его как результат некоторого вычисления (оценка семейства типов)?

Как бы то ни было, программа компилируется при замене () на Bool.


person Herng Yi    schedule 14.07.2015    source источник


Ответы (1)


В случае семейств данных вы должны предоставить определение ADT или GADT в правой части уравнения. () не является допустимым определением конструктора. data instance F Int = Bool объявляет единственный конструктор с именем Bool, который работает, но не имеет ничего общего с типом Bool. Просто Bool доступно как имя конструктора.

Вместо этого то, что вы пытаетесь сделать, можно реализовать с помощью семейств типов:

type family F a
type instance F Int = ()

-- or in closed form
type family F a where
    F Int = ()

Или вы можете указать правую часть для экземпляра данных, которая эквивалентна ():

data instance F Int = FUnit
person András Kovács    schedule 14.07.2015