【问题标题】:Difference between deriving and instance in haskellhaskell中派生和实例的区别
【发布时间】:2017-11-11 09:23:43
【问题描述】:

我有一个类型,我已经创建了Show 类的实例,但我没有得到想要的结果。如果我尝试通过使用 deriving 单词使其成为 show 类的实例,那么它可以工作,但如果尝试如下:

instance Show (SomeValue v) where
  show (Null) = "You have no value"
  show (Justs v) = show (Justs v)

findKey key = foldr (\(k,v) acc -> if key == k then Justs v else acc ) Null 

它进入一个无休止的循环(有点)。我认为我通过使用deriving word 得到的默认实现有效,上面的代码有什么问题?它编译但它不打印任何东西。

我是否可以像这样打印值:(没有“Justs”)?

instance Show (SomeValue v) where
  show (Null) = "You have no value"
  show (Justs v) = show (v)

【问题讨论】:

  • @WillemVanOnsem 不一样。对于我的数据构造函数,我只有两个值,对于这两个值,我已经定义了 show 但它不打印任何内容,我什至尝试使用类型注释来读取,但它不起作用:)
  • 当然它不打印任何东西,它陷入了无限循环。
  • 除了使用deriving word 之外的解决方案是什么?这么多问题的借口:(

标签: haskell


【解决方案1】:

代码

show (Justs v) = show (Justs v)

出于同样的原因进入无限循环

f x = f x

会。

您可以按照您的要求在没有Justs 的情况下编写它,您只需要对实例进行约束


instance (Show v) => Show (SomeValue v) where
    show Null = "You have no value"
    show (Justs v) = show v

因为如果您要尝试显示vv 应该是可显示的,不是吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多