Haskell问题:限制使用show的数据类型

usr*_*usr 3 haskell types existential-type typeclass gadt

码:

data Exp a = Const a | Eq (Exp a) (Exp a)
Run Code Online (Sandbox Code Playgroud)

我希望Const a包含一个show类型的值,以便我可以在以后打印它.所以在C#中我会写:

class Const : Exp { IShow X; }
class Eq : Exp { Exp X, Y; }
Run Code Online (Sandbox Code Playgroud)

我怎么能在Haskell做到这一点?

eph*_*ent 6

{-# LANGUAGE GADTs #-}

data Exp a where
    Const :: Show a => a -> Exp a
    Eq :: Exp a -> Exp a -> Exp a
Run Code Online (Sandbox Code Playgroud)

如果你想在不同的分支中允许不同的数据类型,Eq那也没关系.

data Exp where
    Const :: Show a => a -> Exp
    Eq :: Exp -> Exp -> Exp
Run Code Online (Sandbox Code Playgroud)

  • 正如您在第一个示例中所做的那样,对数据构造函数施加这种约束的目的是什么?任何需要在 Exp 上调用“show”的函数仍然必须在其签名中包含该约束。我能想到这样做的唯一原因是提供有关“a”类型变量实际上应该是什么的提示。我可能会错过任何其他好处吗? (2认同)
  • `Eq(Const 0)(Const"")`对于一个人来说是合法的.不,不需要一个`Show`约束,因为类型系统已经保证`Const`不能用任何缺少`show`的东西打包.见http://www.haskell.org/haskellwiki/GADT (2认同)