考虑以下几点: {-# LANGUAGE GADTs, GADTSyntax #-}
data Test a where
Test :: Ord a => { first :: a, second :: a } -> Test a
comp :: Test a -> Bool
comp (Test fst snd) = fst < snd
构造Test与一个Ord约束声明。
我使用ProgramT从业务包 {-# LANGUAGE GADTs #-}
import Control.Monad ((<=<))
import Control.Monad.Operational
data Motor' a where
--Define GADT
serialNewportT :: (Monad m, MonadIO m) => ProgramT Mot
我想用DSum来做些什么。要与DSum一起使用,您需要具有一个采用一个类型参数的“标记”类型,例如, data Tag a where
AFirst :: Tag Int
ASecond :: Tag String
但是,我想在图书馆内部使用它。我想让我向用户公开的接口采用任何旧的数据类型,例如 data SomeUserType1 = Foo Int | Bar Stri
在“5. Full OTT”部分末尾,作者展示了如何在OTT中定义构造器中的强制转换索引数据类型。这个想法基本上是把索引的数据类型为参数如下: data IFin : ℕ -> Set where
zero : ∀ {n} -> IFin (suc n)
suc : ∀ {n} -> IFin n -> IFin (suc n)
data PFin (m : ℕ) : Se
我认为GADT非常棒,直到我试图将任何“GADTs”表达式分散在互联网上使用的例子。 传统的ADT可以免费提供Eq定义的平等。在GADTs此代码: data Expr a where
(:+:) :: (Show a, Eq a) => Expr a -> Expr a -> Expr a
(:-:) :: (Show a, Eq a) => Expr a -> Expr a
我正在写一个库来处理使用懒惰评估的无限序列。为简洁起见,我使用广义代数数据类型(GADT)来声明序列中每个项的索引的Ord约束。因此,以下typechecks: {-# LANGUAGE GADTs #-}
data Term ix cff where
Term :: (Ord ix) => ix -> cff -> Term ix cff
data Sequence ix cf
数据Foo a的定义如下: data Foo a where
Foo :: (Typeable a, Show a) => a -> Foo a
-- perhaps more constructors
instance Show a => Show (Foo a) where
show (Foo a) = show a
一些实例: fiveFoo :: Fo
是否可以使用record syntax来声明constrained data type?我的尝试 data ConstrainedRecord a where
ConstrainedRecord :: Num a => { first :: a, second :: a }
导致GHC抱怨“记录语法在这里是非法的”。
我想要做一些高级的类型级编程;这个例子是我的原始程序的简化版本。 我有(Haskell)类型的表示形式。在这个例子中,我只涉及函数类型,基本类型和类型变量。 表示Type t由一个类型变量t参数化,以允许区分类型级别。为了达到这个目标,我主要使用GADT。不同的类型和类型变量通过使用类型级文字来区分,因此KnownSymbol约束和使用Proxy s。 {-# LANGUAGE GADTs, Ty