(类型,值)对的列表可以在Idris上表示为:
data List : Type where
Cons : (t : Type ** t) -> List -> List
Nil : List
example : List
example = Cons (Nat ** 3) (Cons (Bool ** True) Nil)
在Haskell上表达这些语法的语法是什么?
答案 0 :(得分:8)
请注意,如果您构造此类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
进行编码。在上面的例子中,它被切成了
定义
您还可以使用除类型之外的其他内容来创建从属对 元件。但是你必须阅读 singletons