[英]Is it possible to express the type of (Type,Value) pairs on Haskell?
(类型,值)对的列表可以在Idris上表示为:
data List : Type where
Cons : (t : Type ** t) -> List -> List
Nil : List
example : List
example = Cons (Nat ** 3) (Cons (Bool ** True) Nil)
在Haskell上表达这些语法的语法是什么?
请注意,如果构造此类List
,则无法对元素执行任何操作,因为您无法对类型进行模式匹配。
然而,在Haskell中完全有可能使用GADTs
data List where
Cons :: t -> List -> List
Nil :: List
example :: List
example = Cons (3 :: Int) (Cons True Nil)
您可以使用约束来扩展它,例如Typeable
这样您就可以获得运行时类型信息来对列表中的元素执行操作:
data CList (c :: * -> Constraint) where
CCons :: Typeable t => t -> List c -> List c
CNil :: CList c
exampleC :: CList Typeable
exampleC = CCons (3 :: Int) (CCons True CNil)
或者您可以使用HList
data HList (xs :: [*]) where
HCons :: x -> List xs -> List (x ': xs)
HNil :: '[]
exampleH :: HList '[Int, Bool]
exampleH = HCons 3 (HConst True HNil)
特别是依赖对(或者总和!)( Idris docs )在Haskell中是可能的,但是我们必须为函数创建一个GADT! http://hackage.haskell.org/package/dependent-sum是一个很多用途
如果Idris版本是
data DPair : (a : Type) -> (P : a -> Type) -> Type where
MkDPair : {P : a -> Type} -> (x : a) -> P x -> DPair a P
当a = Type
时,Haskell没有太大的不同:
data DPair (p :: * -> *) where
MkDPair :: p a -> DPair p
和p
用GADT
编码。 在上面的例子中,它被切成了定义。
您还可以使用除类型之外的其他内容作为第一个元素。 但是你必须阅读有关单身人士的内容 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.