#list #haskell #types #declaration #ghci
#Список #haskell #типы #объявление #ghci
Вопрос:
В Haskell с использованием компилятора ghci требуется создать тип данных, который либо пуст, либо имеет тройной. Я пытался создать пустой тип, но мой тип данных E не позволяет мне его использовать. Как вы правильно объявляете это?
type Empty = []
data E = Zero Empty | Triple A B C
Я продолжаю получать эту ошибку: ожидаю, что еще один аргумент будет ‘пустым’
Ожидаемый тип, но ‘Empty’ имеет вид ‘* -> *’
Комментарии:
1.
[]
это не тип; это конструктор типа.2. По аналогии с «Тройным», «четырехкратным», «Пятикратным», должен ли конструктор на самом деле называться «Zerople»? =D
3. Придерживаясь латинских префиксов, это было бы «Nilple», или, чтобы избежать глупостей с автозаменой, «Nihilple».
Ответ №1:
Вы смешиваете конструкторы типа и данных и используете конструктор типа []
(через псевдоним Empty
, где ожидается обычный тип.
Рассмотрим это псевдо-хаскелловское определение конструктора списка:
data [] a = [] | a : ([] a)
Здесь []
есть как конструктор типа с типом * -> *
, так и нулевой конструктор данных с типом [a]
, представляющий пустые списки.
Для вашего типа сделайте то же самое: Zero
это просто нулевой конструктор данных.
data E = Zero | Triple A B C
(предполагая, что A
, B
и C
являются фиксированными типами. Если вы пытаетесь определить тройку произвольных типов, вам необходимо параметризовать E
:
data E a b c = Zero | Triple a b c
).