首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建StandaloneDeriving实例

如何创建StandaloneDeriving实例
EN

Stack Overflow用户
提问于 2017-01-30 15:13:45
回答 1查看 291关注 0票数 1

给定以下代码

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

type Date = Int
data Decision a = Decision a deriving (Show)  

data InProgress a = InProgress {progress :: a, decision :: Decision a } deriving (Show)
data Finished a = Finished {finished :: a, initial :: a, timestamp :: Date } deriving (Show)  

data LineItem a = LineItem {article :: a String, amount :: a Float, units :: a Int } deriving (Show)  

我得到以下错误

代码语言:javascript
复制
source_file.hs:11:96:
    No instance for (Show (a Float))
    arising from the second field of ‘LineItem’ (type ‘a Float’)
    Possible fix:
    use a standalone 'deriving instance' declaration,
        so you can specify the instance context yourself
    When deriving the instance for (Show (LineItem a))

我在下面尝试了一些类似的变体--但是我无法运行它。

代码语言:javascript
复制
deriving instance Show a => Show (InProgress Float)

我怎么才能解决这个问题?(如果能给出一些解释就好了)

编辑

好吧,我找到解决办法了

代码语言:javascript
复制
deriving instance Show (LineItem InProgress)

会做我想做的。但我还是不明白为什么不

代码语言:javascript
复制
deriving instance Show a => Show (LineItem (InProgress a))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-30 15:36:23

a is LineItem a不是一种类型,即它没有类*。相反,它有着善良的* -> *

这意味着a将被类型构造函数替换。例如,LineItem Maybe很好,但LineItem (Maybe Int)不是。

最通用的Show实例是这样的

代码语言:javascript
复制
deriving instance (Show (a String), Show (a Int), Show (a Float)) 
                  => Show (LineItem a)

但在这里,语境涉及比头部更复杂的类型。这肯定需要打开UndecidableInstances,可能还需要一些其他扩展。

注意,由于这个实例没有将head“简化”成更小的约束,所以通过添加进一步的“坏”实例,我们可以让编译器永远循环。在实践中,这种情况很少发生,我也不会太担心。

如果您知道a在以后的使用中只有有限数量的情况,您可以一个一个地列出它们,为每个实例提供一个实例,就像您在编辑中所做的那样。

代码语言:javascript
复制
deriving instance Show (LineItem TyCon1)
...
deriving instance Show (LineItem TyConN)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41939280

复制
相关文章

相似问题

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