我见过Haskell类链的情况,它们都相互“扩展”(例如,参见gtk2hs中的widget / container / etc类)
class Class1 a where....
class (Class1 a)=>Class2 a where....
class (Class2 a)=>Class3 a where....
....and so on....
其中所有类函数都具有依赖于一个Class1函数的默认值。这很有效,但却使ClassN
真的很难实现“实例化”Instance Class1 Object where
func x = ....
Instance Class2 Object
Instance Class3 Object
Instance Class4 Object
Instance Class5 Object
....and so on....
(我在流行的hackage库中看到过这样的代码,所以我很确定在编写代码时这是一种正确的方法)。
我的问题 - 是否有更新的GHC扩展可以清理它。我看了一下,没有找到任何。理想情况下,您真正需要的是将Object作为ClassN的一个实例去掉,并给出Class1函数,其余部分将被推断出来。
[preemptive snarky comment :) - 这表示“面向对象”的思维方式,你应该真正学习如何在功能上进行编程。
我的回答 - 我同意它非常面向对象,但是这样的代码存在于当今的生态系统中,并且可能非常需要,例如gtk2hs等GUI库。从实际角度来看,我有时需要编写这样的代码,我只想简化它。]
答案 0 :(得分:3)
添加同义词实例是讨论的提案。
例如,可以编写下一个代码:
type Stringy a = (Read a, Show a)
instance Stringy a where
read = ...
show = ...
在这种情况下,可以声明
type ClassAll a = (Class1 a, Class2 a, Class3 a, Class4 a)
instance ClassAll a where
foo = ...
但是现在,类型约束只能用于函数的签名,而不能用于实例。
<强>已更新强>
正如Vittor所提到的,你可以在这里找到提案:Multi-headed instance declarations 原始提案是class aliases提案
的一部分