我在OCaml的手动看到这个例子使用GADT与功能应用的AST的多参数(AST)功能应用: type _ term =
| Int : int -> int term
| Add : (int -> int -> int) term
| App : ('b -> 'a) term * 'b term -> 'a term
let rec eval : type a
是GADTs功能语言相当于传统的OOP +泛型,或者有一种情况下GADT容易实施正确性约束,但使用Java或C#很难或不可能实现? 例如,这种“良好类型的解释”哈斯克尔程序: data Expr a where
N :: Int -> Expr Int
Suc :: Expr Int -> Expr Int
IsZero :: Expr Int -> Expr Boo
该数据类型可以有type role HCons' representational representational,允许使用coerce添加或删除应用于元素的新类型,而不需要遍历列表。 data HNil' = HNil'
data HCons' a b = HCons' a b
然而,对于这些列表的语法是不是像你一样的有以下GADT data HList (l::[*]) where
我想完成类似这样的事情,但我无法完全理解语法。 type _ s = Var : 'a -> 'a s
type _ t =
| AA :('a -> 'a s) -> 'c t
| AB : ('a -> 'b s) -> 'c t
let apply_to x = function
| AA g -> g x
| AB g -> g x
这里就是我有一个问题的代码:要在任意多的参数定义 {-# LANGUAGE GADTs, LANGUAGE DataKinds #-}
-- * Universe of Terms * --
type Id = String
data Term a where
Var :: Id -> Term a
Lam :: Id -> Type -> Term b -> Te
(使用更容易复制和粘贴评论) --Say I have the following monad:
{-# LANGUAGE GADTs, FlexibleInstances #-}
data Instruction b where
Write :: a -> Instruction()
Write2 :: (a,a) -> Instruction()
Read
假设我想表示具有常数c,一元函数符号f和谓词P的一阶语言的有限模型。我可以将载体表示为列表m,该常数作为m的元素,函数为有序对m元件(其可以经由一个辅助函数ap被应用)的列表,和谓词作为满足它的m的元素的列表: -- Models (m, c, f, p) with element type a
type Model a = ([a], a, [(a,a)], [a])
-- helper
我正在通过a GADT walkthrough进行阅读,并陷入其中一个练习。给定的数据结构是: {-# LANGUAGE GADTs, EmptyDataDecls, KindSignatures #-}
data NotSafe
data Safe
data MarkedList :: * -> * -> * where
Nil :: MarkedList t NotSafe
这只是测试,所以我不十分关注,但我有这些定义: type z
type _ s
type (_, _, _) balance =
| Less : (*∀'a.*) ('a, 'a s, 'a s) balance
| Same : (*∀'b.*) ('b, 'b, 'b) balance
| More : (*∀'a.*) ('a s, 'a, 'a s) b