用于列表和符号的符号语法糖

时间:2017-06-13 12:39:32

标签: vector syntax monads idris

所以我注意到在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], [""]]

我假设你有一个名为::的构造函数,但我不确定。如果你有一个名为>>=的构造函数,即使没有monad实现,你也会以同样的方式得到do-notation:

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

这是一个非常酷的功能,唯一的问题是我没有在任何地方找到它。最好确切地知道这些机制是如何工作的,这样可以确切地了解它们可以在什么情况下工作。此外,这些规则是编译器的特权,还是用户可以使用syntaxdsl功能制作它们?

0 个答案:

没有答案