我在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