当前位置:  开发笔记 > 编程语言 > 正文

是否有可能重新实现使用GHC泛型得出的"Enum"

如何解决《是否有可能重新实现使用GHC泛型得出的"Enum"》经验,为你挑选了0个好方法。

是否有可能Enum使用GHC泛型重新实现类型类的派生?

起初,它看起来很简单:

data Foo -- representation without metadata (wrong):
  = Foo  -- L1 U1
  | Bar  -- R1 (L1 U1)
  | Baz  -- R1 (R1 (L1 U1))
  | Quux -- R1 (R1 (R1 U1))
  deriving (Show, Eq, Generic)

-- Rep Foo p = (U1 :+: (U1 :+: (U1 :+: U1))) p

instance Enum Foo where
  toEnum   = undefined -- FIXME
  fromEnum = gfromEnum . from

class GEnum f where
  gfromEnum :: f p -> Int

instance GEnum U1 where
  gfromEnum U1 = 0

instance GEnum f => GEnum (M1 i t f) where
  gfromEnum (M1 x) = gfromEnum x

instance (GEnum x, GEnum y) => GEnum (x :+: y) where
  gfromEnum (L1 x) = gfromEnum x
  gfromEnum (R1 y) = 1 + gfromEnum y

但是,这不会起作用:

?> fromEnum Foo
0
?> fromEnum Bar
1
?> fromEnum Baz
1
?> fromEnum Quux
2

这是因为我们不能依赖于如何对参数(:+:)进行分组.在这种情况下,似乎它们嵌套如下:

((U1 :+: U1) :+: (U1 :+: U1)) p

那么,是否可以推导出Enum使用Generics?如果有,怎么样?

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有