是否可以在Haskell上表达(Type,Value)对的类型?

时间:2018-02-14 22:58:47

标签: haskell types

(类型,值)对的列表可以在Idris上表示为:

data List : Type where
  Cons : (t : Type ** t) -> List -> List
  Nil  : List

example : List
example = Cons (Nat ** 3) (Cons (Bool ** True) Nil)

在Haskell上表达这些语法的语法是什么?

1 个答案:

答案 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