2017-01-09 6 views
0

В LYAHFGG, одна главу говорит, что список определяются как:Что означает «Минусы» и: -: означает в Haskell?

data List a = Cons a (List a) deriving (Show, Read, Eq, Ord) 

Я понимаю, что большинство это означает, что помимо Cons. Когда я пытаюсь :t Cons и :i Cons в ghci Я получаю ошибку не в области. Позже в этой главе он также говорит о том: -: и как это так же, как Cons

infixr 5 :-: 
data List a = Empty | a :-: (List a) deriving (Show, Read, Eq, Ord) 

Но опять-таки я действительно не понимаю, что это означает, что :-: либо.

В другом ресурсе, в разделе о типах данных, они определяют следующие типы данных:

data Expr = X 
     | Const Int 
     | Expr :+: Expr 
     | Expr :-: Expr 
     | Expr :*: Expr 
     | Expr :/: Expr 
     | IfZero Expr Expr Expr 
     deriving (Eq, Ord) 

Где IfZero p q r такое же, как if p == 0 then q else r. Это одно и то же? Я в основном смущен относительно того, что означают два значения, и если это обязательный синтаксис или просто выбор стиля.

+2

Предлагаю вам прочитать синтаксис объявления данных. Это конструкторы. –

+0

@ ThomasM.DuBuisson любые ресурсы, которые вы могли бы предложить? Ни один из них не очень хорошо объясняет. – user6731064

+1

Я всегда чувствовал, что wikibooks - это ресурс с низким рейтингом (https://en.wikibooks.org/wiki/Haskell/Type_declarations), но у LYAH есть глава для этого (http: // learnyouahaskell.com/making-our-own-types-and-typeclasses#algebraic-data-types). –

ответ

5
data List a = Cons a (List a) deriving (Show, Read, Eq, Ord) 

Я понимаю, что большинство это означает, что помимо Cons. Когда я пытаюсь :t Cons и :i Cons в ghci Я получаю ошибку не в области.

Вам необходимо загрузить исходный файл Haskell с data декларации, прежде чем вы можете иметь Cons в области. Или, альтернативно, вы можете ввести эту строку data непосредственно в GHCi.

Для серьезного кода это проще, если вы поместите его в файл и загрузите. Это связано с тем, что процесс обучения обычно включает в себя некоторое изменение файла, его перезагрузку, попытку тестирования в GHCi, изменение файла снова и т. Д. Выполнение этого в GHCi является громоздким.

В любом случае, Cons - это просто имя конструктора - это произвольное имя. Вы можете использовать data List a = Foobar a (List a) .... и назовите его Foobar, если хотите. Cons - историческое название, однако, происходящее из Лиспа.

:-: - другое произвольное имя для конструктора, за исключением того, что его можно использовать infix. То есть вместо Cons 1 someList можно написать 1 :-: someList.

+0

Ах, спасибо, я начал подозревать, что это было во время игры. Я думаю, что слишком много кофе и слишком мало сна - плохая идея. – user6731064

4

:-: - это просто имя инфикса для конструктора данных. Вы можете видеть, что data заявление как эквивалент

data List a = Empty | (:-:) a (List a) 

семантически, нет никакой разницы между использованием (:-:) или Cons, но это гораздо приятнее читать

1 :-: 2 :-: 3 :-: 4 :-: Empty 

чем либо

Cons 1 (Cons 2 (Cons 3 (Cons 4 Empty))) 

или

1 `Cons` (2 `Cons` (3 `Cons` (4 `Cons` Empty))) 
+1

Вы также можете использовать 'Cons' в положении infix, если он заключен в backquotes. Любое имя конструктора, начинающееся с ':' (например, ':' или ': -:'), специализируется как конструктор инфикса и используется как таковое, не закрывая его в backquotes. – chepner

+0

@chepner Конечно, но тогда сами обратные сигналы раздражают. – pyon

+0

Я не могу найти ': -:' в hoogle, и ghci, похоже, не узнает его. Чем он отличается от ':'? –

Смежные вопросы