Что означает тройное двоеточие (:::) в типе данных в haskell?

#haskell

#haskell

Вопрос:

Что означает тройное двоеточие (:::) в типе данных в Haskell?

Например: data Term = Var ID | Atom String | Nil | Term:::Term

Который находится в этой статьеhttps://gup.ub.gu.se/file/207634

Как бы это использовалось?

Например, я могу сделать, foo = Var "hello" но я не знаю, какая польза Term:::Term была бы.

Комментарии:

1. Это конструктор данных.

2. я заметил этот трюк в документации optparse-generic

Ответ №1:

(:::) это имя конструктора данных. Таким образом, вы можете определить Term тип с помощью:

 data Term = Var ID | Atom String | Nil | (:::) Term Term  

итак, точно так же, как у вас есть Var , Atom и Nil в качестве конструкторов данных, (:::) также является конструктором данных. Этот конструктор данных принимает два параметра, которые оба имеют Term типы. Например, список имеет (:) в качестве конструктора данных.

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

 consym        →   ( : {symbol})⟨reservedop⟩
reservedop    →  .. | : | :: | = |  | | | <- | -> |  @ | ~ | =>  

Ответ №2:

Было бы понятнее с синтаксисом GADT?

 data Term :: Type where
  Var   :: ID -> Term
  Atom  :: String -> Term
  Nil   :: Term
  (:::) :: Term -> Term -> Term
  

Эти подписи соответствуют выводам :kind и :type :

 >> :k Term
Term :: *
>> :t Var
Var :: ID -> Term
>> :t Atom
Atom :: String -> Term
>> :t Nil
Nil :: Term
>> :t (:::)
(:::) :: Term -> Term -> Term
  

Комментарии:

1. «Эти подписи соответствуют выводам :kind и :type [ после того, как вы определили data Term = Var ID | Atom String | Nil | Term:::Term ]:»