键入安全铸造到多种潜在类型

时间:2017-07-03 07:54:03

标签: haskell

我目前在我的代码中遇到了类似下面的模式(这是从实际代码中简化而来的,这是一个处理表达式的大型GADT)。

data I = A | B | C | D

type family TC1 (a :: I) :: Constraint where
  TC1 'A = ()
  TC1 'C = ()
  TC1 _ = ('True ~ 'False)

type family TC4 (a :: I) :: Constraint where
  TC4 'B = ()
  TC4 'C = ()
  TC4 'D = ()
  TC4 _ = ('True ~ 'False)

data T (t :: I) where
  T1 :: (TC1 t) => T t
  T2 :: T B
  T3 :: T t
  T4 :: (TC4 t) => T t
  etc

castL :: (Typeable t) => [Maybe t] -> Maybe t
castL l = case catMaybes l of
  (x:_) -> Just x
  [] -> Nothing

mkT1 :: Typeable a => Maybe (T a)
mkT1 = castL [cast (T1 :: T 'A), cast (T1 :: T 'C)]

几个问题:

  1. 是否有更好的方法来指定总是失败的约束而不是('True ~ 'False)
  2. mkT1看起来有点hacky但似乎确实有效。有没有更好的方法呢?
  3. 是否有更好的方法来构建整个事物(我知道这是一个棘手的问题,因为我可以包括我在一个相当长的帖子中尝试实现的所有细节,但我和#39; m基本上生成一个解析树)。

0 个答案:

没有答案