首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell问题:约束数据类型使用显示

Haskell问题:约束数据类型使用显示
EN

Stack Overflow用户
提问于 2009-12-07 00:28:27
回答 5查看 1.1K关注 0票数 3

代码:

代码语言:javascript
复制
data Exp a = Const a | Eq (Exp a) (Exp a)

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

代码语言:javascript
复制
class Const : Exp { IShow X; }
class Eq : Exp { Exp X, Y; }

我怎么才能在哈斯克尔做到这一点?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-07 01:40:21

代码语言:javascript
复制
{-# LANGUAGE GADTs #-}

data Exp a where
    Const :: Show a => a -> Exp a
    Eq :: Exp a -> Exp a -> Exp a

如果您想在Eq的不同分支中允许不同的数据类型,那也可以。

代码语言:javascript
复制
data Exp where
    Const :: Show a => a -> Exp
    Eq :: Exp -> Exp -> Exp
票数 6
EN

Stack Overflow用户

发布于 2009-12-07 01:00:55

你可以说

代码语言:javascript
复制
data (Show a) => Exp a = Const a | Eq (Exp a) (Exp a)

但是,这几乎总是一个坏主意,因为它强制每个使用Exp的函数都提到show约束,即使它从来不使用Show方法。相反,将show约束放在与其相关的函数上。有关解释,请参见真实世界Haskell

票数 4
EN

Stack Overflow用户

发布于 2009-12-07 22:20:01

如果您只想知道Const的参数是可以show的,为什么不直接将结果的String值存储在构造函数中呢?例如:

代码语言:javascript
复制
data Exp = Const String | Eq Exp Expr

example = Eq (Const (show 0)) (Const (show ""))

这与您的C#版本非常相似。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1857131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档