【发布时间】:2015-04-23 08:44:23
【问题描述】:
我有一个数据结构(它是玫瑰树的一个特定子类,它形成一个具有最大下界和最小上界函数的格),它支持两个完全合理的函数来充当Monoid 类的@ 987654324@。
有没有办法在haskell 中支持匿名Monoid 实例?这是我应该考虑使用 Template-Haskell 之类的东西为我生成类型类的实例吗?
我喜欢makeMonoid :: (RT a -> RT a -> RT a) -> Monoid a 让我动态创建实例,但我知道这与我理解的股票类型系统不一致。
如果我只需要选择一个默认的合并函数并为其他合并写newtypes 就可以了,只是好奇
【问题讨论】:
-
如果您有多个实例并且不想在任何地方使用
newtypes,您可以将pass a "Monoid" dictionary around manually 用作data RTMonoid a = { empty :: RT a, append :: RT a -> RT a -> RT a}和rt1 :: RTMonoid a; rt1 = RTMonoid ...;rt2 :: RTMonoid a; rt2 = RTMonoid ...,然后您可以编写函数来接受您使用的RTMonoid a参数。手动传递它有点笨拙,但它使它更具可扩展性。如果您只有 2 个实例,请使用新类型。 -
您根本没有必须选择默认值——强制用户选择使用新类型可能会更好。您还可以对
mergeThisWay和mergeThatWay使用单独的函数。 -
您可以使用hackage.haskell.org/package/lattices 中的类型类 就我个人而言,我希望在Haskell 中更频繁地使用格子。它们是如此有用的结构。
标签: haskell types metaprogramming