由不同类型元素组成的列表——异类表的相关问题

1.Typeable和Dynamic

  • Data.Typeable模块 enter image description here

     --获取类型信息的方法
    typeOf :: forall a. Typeable a => a -> TypeRep
    
  • TypeRef

  • Proxy

    data Proxy a = Proxy
    

    enter image description here

  • Data.Dynamic模块

    data Dynamic = Dynamic TypeRep Obj
    toDyn :: Typeable a => a -> Dynamic
    fromDyn :: Typeable a => Dynamic -> a -> a    
    fromDynamic :: Typeable a => Dynamic -> Maybe a
    dynTypeRep :: Dynamic -> TypeRep
    

    但凡是Typeable类型类的数据,都可以和Dynamic相互转换

  • GHC7.10后语言扩展AutoDeriveTypeable会自动打开 -Typeable的存在,消除了任何隐式的基于类型的操作

2.存在类型 Existential Type

{-# LANGUAGE ExistentialQuantification #-}

data Dyn = forall a. Show a => Dyn a

instance Show Dyn where
    show (Dyn a) = "Dyn:" ++ Show a
  • 我们把上述在类型定义的右侧,显示地引入类型变量的类型叫做存在类型

  • 内联类型类词典

3.类型家族、数据家族和GADT

Haskell的类型系统一个强大的地方在于:可以把很多运行时才能解决的问题转移到编译阶段。

  • 类型家族:type关键字在类型层面定义新的类型函数
  • 数据家族:data关键字可以定义新的类型以及对应的构造函数

    data family T a
    data    instance T Int  = T1 Int | T2 Bool
    newtype instance T Char = TC Bool
    
  • 在定义类型类的同时定义数据家族

    class GMapKey k where:
        data GMap k :: * -> *
        empty       :: GMap k v
        lookup      :: ...
    
  • GADT Generalised Algebraic Datatype

    data T ... where
        C1 ... :: T ...
        C2 ... :: T ...
        ...
    

4.数据类别 DataKinds

  • 通过语言扩展,GHC支持我们把data/newtype定义的数据类型提升成类别
  • Haskell自带的数据类型和构造函数也可以提升成类别和对应的类型

    {-# LANGUAGE DataKinds, GADTs, kindsgnatures, TypeOperators #-}
    data HList :: [*] -> * where
        HNil :: Hlist '[]
        HCons :: x -> HList xs -> HList (x ': xs)