Стандартное определение списка - PullRequest
8 голосов
/ 08 апреля 2011

У меня проблема с определением списка. Обычно список определяется как data [a] = [] | a : [a] но если я напишу что-то подобное в моем конкретном коде, я буду определять data T a = N | a -> (T a), интерпретатор выдаст мне ошибку:

Неправильная глава объявления типа или класса

Вы знаете, что не так? .

Ответы [ 2 ]

14 голосов
/ 08 апреля 2011

Похоже, ваша проблема в том, что вы пытались использовать -> в качестве инфиксного конструктора, например : (для построения списка с использованием синтаксиса a -> b -> N). Это недопустимо, потому что пользовательские инфиксные конструкторы в Haskell должны начинаться с символа :.

Причина вашего странного сообщения об ошибке заключается в том, что -> в Haskell зарезервирован для типов функций, как ответ Джеффа объясняет

Попробуйте вместо этого:

-- Create a right-associative infix constructor.
data T a = N | a :-> (T a)
infixr :->

mylist :: T Int
mylist = 10 :-> 17 :-> N

--If we hadn't made the operator right associative,
-- we would need to use explicit parenthesis here
myotherlist :: T Int
myotherlist = 10 :-> (17 :-> N)

-- Example function
isempty :: T a -> Bool
isempty N         = False
isempty (_ :-> _) = True
7 голосов
/ 08 апреля 2011

a -> T a будет означать, что a - это функция, которая возвращает что-то вроде T a, так что я думаю, что это неправильно. Попробуйте что-то вроде этого.

data T a = N | R a (T a)

N - значение пустого списка (эквивалент []), а R - конструктор значений (эквивалент :)

С правой стороны вам нужен способ переноса значения a. Теперь вы можете правильно списки, как.

> N -- The empty List
> R 5 N -- a list with a single element and then the end
> R 7 (R 6 (R 5 N)) -- the list 7, 6, 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...