Haskell: Как я могу создать пустой список в качестве опции для типа данных?

#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
  

).