我有一个从单继续练习我的Haskell的主题,我一直在考虑以下几点: data Expr = Con Value
| And Expr Expr
data Value = IntValue Int
| BoolValue Bool
est :: Expr -> Val
est (Con v) = v
est (And x y) =
case (es
我正在阅读GADT介绍here,它发现限制程序员只创建正确类型的语法树的想法很好,我把这个想法放入我的简单lambda演算解释器中,但后来我意识到我无法解析字符串到这个语法树,因为一个解析函数需要根据输入返回不同类型的语法树。这里有一个例子: {-# LANGUAGE GADTs #-}
data Ident
data Lambda
data Application
data Expr
我想编写一个Haskell程序,它在GHCi(即mipsel上的GNU/Linux)不支持的平台上交互使用GADT。问题是,可用于在GHC定义GADT,例如结构: data Term a where
Lit :: Int -> Term Int
Pair :: Term a -> Term b -> Term (a,b)
...
似乎并不在拥抱的工作。 在Hugs
我发现我真的很喜欢将GADT与Data Kinds结合使用,因为它为我提供了比以前更多的类型安全性(对于大多数用途,几乎和Coq,Agda等一样好)。可悲的是,模式匹配在最简单的例子上失败了,除了类型类之外,我想不出写函数的方法。 这里的解释我的悲伤的例子: data Nat = Z | S Nat deriving Eq
data Le :: Nat -> Nat -> * where
我想representat MOD-N计数器作为间隔[0, ..., n-1]的切分为两个部分: data Counter : ℕ → Set where
cut : (i j : ℕ) → Counter (suc (i + j))
利用这一点,定义了两个关键的操作是直接的(一些样张省略为了简洁): _+1 : ∀ {n} → Counter n → Counter n
cut
在Type-Safe Observable Sharing in Haskell Andy Gill展示了如何在DSL中恢复Haskell级别上存在的共享。他的解决方案在data-reify package中实施。此方法是否可以修改为与GADT一起使用?例如,鉴于此GADT: data Ast e where
IntLit :: Int -> Ast Int
Add :: As