这星期的文章是

http://cs.brynmawr.edu/~rae/papers/2012/singletons/paper.pdf

这paper在codewars上,可以做做看:Singletons | Codewars

这文章在说两件事情:

0:用一种design pattern来做DT

1:这个design pattern可以用库automate一大部分

0:

假设我们有普普通通的data Nat = Z | S Nat。

首先,如果我们要把这用上type level(因为dependent type就是value可以在typelevel使用),我们需要额外的两个类型,一个ZType :: *,一个SType :: * -> *,来表示Nat的type level表示。然后,type level的Nat函数,可以用type family写出。

然后,可以用GADT表示inductive dependent type,比如Vec之类的。如果不支持GADT(什么鬼,不支持还想玩奇怪特性)可以考虑考虑用gadtless programming,换句话说用Leibniz Equality手动解constraint。。。

但是,由于parametricity,这无法做到:给入一个type level Nat,输出一个该长度的Vec。。。所以,做法是,再弄一个GADT inductive type,这个GADT的value是indexed on type level nat的。换言之,每一个type level nat,都能在这个GADT中找到一个unique的对应值。这就叫singleton

最后,很多时候singleton可以隐式推出,所以可以弄成一个constraint。

总结,一个datatype有4种做法:普通的,type level的,singleton,singleton变成constraint(换句话说,typeclass)。

1:

type level的可以由GHC的DataKinds扩展自动生成。

singleton constraint可以统一到一个typeclass

由template haskell可以从普通函数生成singleton函数跟type level函数(type family)

最后:singleton constraint跟Data.Constraint有异曲同工之妙:)

还有,下期想看啥接着私信我。。。no monad tutorial,no 女装=/=