6
循环,我现在有像下面这样的结构:防止相互递归默认的方法在运行时
class F a where
f :: ...
default f :: (G a...) => ...
f = (some definition in terms of g)
class F a => G a where
g :: ...
default g :: (C a...) => ...
g = (some definition in terms of f)
在希望有些简单的英语,我可以在g
始终方面写f
。我有时可以按f
编写g
,即当a
满足C
约束。
我在这里看到的问题是,如果有人写,对于说类型T
满足C T
instance F T
instance G T
这将在运行时编译和循环。虽然两个默认定义都是正确的,但重要的是至少定义一个。
如果f
和g
在同一个类中,我可以用MINIMAL
编译指令解决这个问题,但在这种情况下它们不是。
而且把两者f
和g
在同一类似乎并不可能,因为虽然有针对g
每一个定义的f
定义,没有为f
每一个定义的g
定义。一种可能性是将g
转换为F
,但同时也对其设置了约束条件,但这会阻止我为任何不符合C a
的a
定义g
,其中非默认定义为a
。
有没有办法重组这个来解决我面临的困境?
另一种退而求其次的选择会不会有g'和/或'F'的'默认定义,但是,而不是提供一个实例,作家可以用它来显式的指定选入到一个独立的函数“默认”实现(通过编写'g = defaultG')。希望至少让它有点难以忽略,因为至少有一个是故意的选择。 – Ben