防止相互递归的默认方法在运行时循环

时间:2017-10-09 05:29:57

标签: haskell typeclass

我目前的结构如下:

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)

希望有点简单的英语,我总是可以用fg。我有时可以用gf,即当a满足C约束时。{/ p>

我在这里看到的问题是,如果某人写道,例如T类型满足C T

instance F T
instance G T

这将在运行时编译和循环。虽然两个默认定义都是正确的,但重要的是至少定义了一个。

如果MINIMALf属于同一个类,我可以使用g编译指示解决此问题,但在这种情况下它们不是。

同时将fg放在同一个类中似乎不可能,因为f的每个定义都有g的定义,g的每个定义都没有f的定义。一种可能性是将g移至F,但也对其C a约束,但这将阻止我使用任何{{的非默认定义来定义g 1}}不满足a

有没有办法重组这个来解决我面临的这种困境?

1 个答案:

答案 0 :(得分:0)

我之前的回答是无稽之谈,所以相反,这是一个(希望)更好的答案。这至少会在编译时给你一个警告。如果两个f'都包含gG的实例,则可以在课程a中实施FG,但仅限{{1}如果f的实例是不可能的。

G