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