在下面的代碼中,我可以替換什麼x = ...。請注意,我不想對類別a設置類別限制(當然,a也是類型Bool,因此只能採用兩種類型之一)。 {-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
data D (a :: Bool) where
D1 :: D True
在下面的代碼編譯錯誤,T1和T2編譯罰款,但T3失敗: {-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
type family F a
data T1 b where
T1 :: a -> T1 (F a)
data T2 b where
T2 :: { x2 :: a } -> T2 a
data T
自動獲得節目實例假設我有一個複雜GADT與許多隱藏類型參數的構造函數: data T where
A :: Num n => n -> T
B :: (Num n, Integral m) => n -> m -> T
C :: Floating a => [a] -> T
-- and so on
Z :: Num n => n -> n ->
我試圖建模一個「異構樹」,即。一棵樹,其中節點具有不同的「種」,每個「種」在孩子們的「種」被限制它們可能包含: type id = string
type block
type inline
type _ node =
| Paragraph : id * inline node list -> block node
| Strong : id * inline nod
幾周前,我讀了Writing an interpreter using fold。我嘗試將這種方法應用到我正在處理的項目上,但由於GADT存在錯誤。這是產生相同問題的玩具代碼。 {-# LANGUAGE GADTs, KindSignatures #-}
data Expr :: * -> * where
Val :: n -> Expr n
Plus :: Exp
此代碼 {-# LANGUAGE GADTs #-}
data Expr a where
Val :: Num a => a -> Expr a
Eq :: Eq a => Expr a -> Expr a -> Expr Bool
eval :: Expr a -> a
eval (Val x) = x
eval (Eq x y) = (eval x) == (e
我想弄清楚類型類和GADTS之間的差異,特別是在使用-XMultiParamTypeClasses擴展名時。 似乎都具有類似用途: class MyClass a b where
f :: a -> b -> Bool
instance MyClass String String where
f s1 s2 = ...
instance MyClass Int Int
使用了一些擴展變量數,我可以做這樣的事情: {-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
type family TF (a :: Bool) where
TF 'True = Int
TF