Dependently Typed Programming with Singletons

這星期的文章是

cs.brynmawr.edu/~rae/pa

這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 女裝=/=


推薦閱讀:

Erlang入門教程 - 1. Erlang Shell
APL/J 安利:三次方求和公式是什麼? (J)
Haskell 實現相關的 reading list
學習haskell的過程中有哪些值得一做的練手項目?
函數式-21天入門教程

TAG:函数式编程 | Haskell |