Обозначение синтаксиса сахар для списка и сделать нотации
Итак, я заметил, что в Idris вы определяете свой собственный список или векторный тип, например, следующий тип, который я считаю полезным:
data HFVec : (f : Type -> Type) -> (n : Nat) -> Vec n Type -> Type where
Nil : HFVec f Z []
(::) : (a : f t) -> HFVec f n ts -> HFVec f (S n) (t :: ts)
- тогда вы получите список синтаксиса бесплатно:
test : HFVec List 2 [Int, String]
test = [[3], [""]]
Я предполагаю, что это сделано, когда у вас есть конструктор с именем ::
, но я не знаю наверняка. Таким же образом вы получаете do-нотацию, если у вас есть конструктор с именем >>=
даже если нет реализации монады:
data Test : Type -> Type where
Pure : a -> Test a
(>>=) : Test a -> (a -> Test b) -> Test b
test : Test Int
test = do
Pure 1
x <- Pure 2
Pure x
Это довольно крутая функция, единственное, что я нигде не нашел ее документированной. Было бы хорошо знать, как именно работают эти механизмы, чтобы точно знать, при каких обстоятельствах они могут работать. Кроме того, являются ли такие правила привилегией компилятора или пользователь может создавать их с помощью syntax
а также dsl
функции?