haskell – 封闭式系列中的模式匹配

我无法尝试使用GHC 7.8的新封闭式系列功能

我想找到一种很好的方法来分支类型级别的结构.

我有类似的东西

data (:::) :: Symbol -> * -> * where

data Result = Pre | Post | Match

type family Cmp a b :: Result where
    Cmp (s ::: t) (s ::: t) = Match
    Cmp (s1 ::: t1) (s2 ::: t2) = ???

在哪里我想根据结果返回不同的类型
GHC.TypeLits中的CmpSymbol.感觉就像是

Cmp (s1 ::: t1) (s2 ::: t2) = (CmpSymbol s1 s2 ~ LT) => Pre
Cmp (s1 ::: t1) (s2 ::: t2) = (CmpSymbol s1 s2 ~ GT) => Post

应该工作,但事实并非如此.有趣的是,这不是语法错误而是
而是投诉它是不适当的.

我可以通过使用不可判定的实例和a来以某种方式使它工作
辅助功能:

type family Cmp a b :: Result where
    Cmp (s ::: t) (s ::: t) = Match
    Cmp (s1 ::: t1) (s2 ::: t2) = Fun (CmpSymbol s1 s2)

type family Fun r :: Result where
    Fun LT = Pre
    Fun GT = Post

但这感觉相当笨重,肯定有更好的方法吗? ghci也说
类似的东西:善良! Cmp(“a”::: Int)(“a”::: String)具有Fun’EQ类型
即使Fun已关闭.这是为什么?我也看不到一个简单的方法
和普通班一起工作?如果Fun的定义是什么怎么办?
喜欢

class Fun2 o r
instance Fun2 LT Pre
instance Fun2 GT Post

有没有办法以一种很好的方式与类型类进行对话,或者我只限于
使用其他类型的家庭,如Fun?

最佳答案 这真的是唯一的方法,虽然我喜欢定义一些可重用的类型函数(==和If),在你的情况下它会变成If(CmpSymbol s1 s2 == LT)Pre Post.

不幸的是,没有办法获得类型LT的类型功能 – >来自像Fun2这样的课程.

你的例子有趣的EQ,因为CmpSymbol“a”“a”是EQ,你将它传递给Fun.它不仅仅是一个错误的原因是类型系列被评估为尽可能晚 – 在这里你不要求Fun EQ的“价值”,所以没有必要对它进行评估.

点赞