自动将类型类实例设为另一个实例

塞文蒂米尔

我想要实现的是,以下类(SampleSpace)的任何实例都应自动为的实例Show,因为它SampleSpace包含创建String表示形式所需的整个接口,因此该类的所有可能实例实际上是相同的。

{-# LANGUAGE FlexibleInstances #-}
import Data.Ratio (Rational)                                               

class SampleSpace space where                                               
    events          :: Ord a => space a -> [a]                              
    member          :: Ord a => a -> space a -> Bool                        
    probability     :: Ord a => a -> space a -> Rational                    

instance (Ord a, Show a, SampleSpace s) => Show (s a) where                 
    show s = showLines $ events s                                           
        where                                                               
        showLines [] = ""                                                   
        showLines (e:es) = show e ++ ":   " ++ (show $ probability e s)
                                  ++ "\n" ++ showLines es

因为,正如我已经发现的那样,在匹配实例声明时,GHC只看头,而不看约束,因此它Show (s a)也与Rational有关:

[1 of 1] Compiling Helpers.Probability ( Helpers/Probability.hs, interpreted )

Helpers/Probability.hs:21:49:
    Overlapping instances for Show Rational
      arising from a use of ‘show’
    Matching instances:
      instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
        -- Defined in ‘GHC.Real’
      instance (Ord a, Show a, SampleSpace s) => Show (s a)
        -- Defined at Helpers/Probability.hs:17:10
    In the expression: show
    In the first argument of ‘(++)’, namely ‘(show $ probability e s)’
    In the second argument of ‘(++)’, namely
      ‘(show $ probability e s) ++ "" ++ showLines es

问题:是否有可能(除了通过启用重叠实例)使类型类的任何实例也自动成为另一个类的实例?

到处走走

tl; dr:不要这样做,或者,如果您坚持要使用-XOverlappingInstances

  1. 这不是Show该类的目的。Show用于简单地显示纯数据,实际上是一种Haskell代码,可以再次使用,从而产生原始值。
  2. SampleSpace也许不应该是一门课。似乎基本上是Map a Rational与它们相关联的类型的类为什么不将其用作纯data类型的字段
  3. 即使我们接受设计...Show当某人为具体类型创建另一个实例时,这样的泛型实例(或者实际上是任何单参数类的泛型实例)Show也会遇到问题–对于,周围有很多实例。那么,编译器应如何决定使用两个实例中的哪一个?实际上,GHC可以做到这一点:如果您打开-XOverlappingInstances扩展名,它将选择更具体扩展名(即被instance SampleSpace s => Show (s a)任何更具体的实例“覆盖”),但实际上这并不像看起来那么琐碎–如果有人定义了另一个这样的通用实例?重要的是要记住:Haskell类型类始终是开放的,即,基本上,编译器必须假定所有类型可以在任何类中使用。只有当特定实例被调用时,它才真正需要证明,但是它永远不能证明某种类型不在某个类中。

我要推荐的内容是-由于该Show实例不仅显示数据,还应将其设置为其他函数。任何一个

showDistribution :: (SampleSpace s, Show a, Ord a) => s a -> String

或确实

showDistribution :: (Show a, Ord a) => SampleSpace a -> String

其中SampleSpace是单个具体类型,而不是类。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将一个类实例转换为另一个类的实例

来自分类Dev

如何将一个类的实例方法与另一个实例化?

来自分类Dev

如何将一个类的实例方法与另一个实例化?

来自分类Dev

试图将一个对象的实例传递给另一个类

来自分类Dev

将一个类实例与另一个包含匹配值的实例进行比较

来自分类Dev

在另一个类实例中获取一个类实例的变量的值

来自分类Dev

将类绑定到另一个类的实例

来自分类Dev

将模板类实例传递给另一个类的构造函数

来自分类Dev

通过方法将类实例附加到另一个类的列表变量

来自分类Dev

引用相同对象类型的另一个对象实例的类对象属性

来自分类Dev

如何将类的每个实例与另一个类的每个实例相关联?

来自分类Dev

如何将Ruby类实例变量初始化为另一个类的新实例?

来自分类Dev

将类对象实例作为参数从 main() 传递给另一个类对象实例

来自分类Dev

将类实例的每个字段复制到另一个类实例以保持数据绑定

来自分类Dev

从另一个类Ruby调用实例方法

来自分类Dev

从另一个类获取实例变量?

来自分类Dev

在另一个类中创建该类的实例

来自分类Dev

从另一个类访问变量的实例

来自分类Dev

如何从另一个类访问实例化?

来自分类Dev

从JavaScript中的另一个实例实例化一个类?

来自分类Dev

python如何将一个类的实例变量转换为另一个类?

来自分类Dev

将专业化定义为另一个类的实例化

来自分类Dev

如何创建将知道其实例在另一个类的矩阵中的方法

来自分类Dev

我可以将Dictionary分配为另一个类实例的属性吗?

来自分类Dev

将当前类的实例作为参数发送给另一个

来自分类Dev

将类实例的输出作为输入传递给另一个

来自分类Dev

如何将 testNG 实例携带到另一个类

来自分类Dev

使用构造函数将驱动程序实例传递给另一个类

来自分类Dev

如何将浮动提升到另一个类的实例?

Related 相关文章

  1. 1

    将一个类实例转换为另一个类的实例

  2. 2

    如何将一个类的实例方法与另一个实例化?

  3. 3

    如何将一个类的实例方法与另一个实例化?

  4. 4

    试图将一个对象的实例传递给另一个类

  5. 5

    将一个类实例与另一个包含匹配值的实例进行比较

  6. 6

    在另一个类实例中获取一个类实例的变量的值

  7. 7

    将类绑定到另一个类的实例

  8. 8

    将模板类实例传递给另一个类的构造函数

  9. 9

    通过方法将类实例附加到另一个类的列表变量

  10. 10

    引用相同对象类型的另一个对象实例的类对象属性

  11. 11

    如何将类的每个实例与另一个类的每个实例相关联?

  12. 12

    如何将Ruby类实例变量初始化为另一个类的新实例?

  13. 13

    将类对象实例作为参数从 main() 传递给另一个类对象实例

  14. 14

    将类实例的每个字段复制到另一个类实例以保持数据绑定

  15. 15

    从另一个类Ruby调用实例方法

  16. 16

    从另一个类获取实例变量?

  17. 17

    在另一个类中创建该类的实例

  18. 18

    从另一个类访问变量的实例

  19. 19

    如何从另一个类访问实例化?

  20. 20

    从JavaScript中的另一个实例实例化一个类?

  21. 21

    python如何将一个类的实例变量转换为另一个类?

  22. 22

    将专业化定义为另一个类的实例化

  23. 23

    如何创建将知道其实例在另一个类的矩阵中的方法

  24. 24

    我可以将Dictionary分配为另一个类实例的属性吗?

  25. 25

    将当前类的实例作为参数发送给另一个

  26. 26

    将类实例的输出作为输入传递给另一个

  27. 27

    如何将 testNG 实例携带到另一个类

  28. 28

    使用构造函数将驱动程序实例传递给另一个类

  29. 29

    如何将浮动提升到另一个类的实例?

热门标签

归档