鑑於Free Monad
:定義平等實例免費單子
data Free f a = Var a
| Node (f (Free f a))
我試圖爲它定義一個Eq
實例:
instance (Functor f, Eq (f a)) => Eq (Free f a) where
(==) (Var x) (Var y) = x == y
(==) (Node fu1) (Node fu2) = fu1 == fu2
(==) _ _ = False
但是,這無法編譯:
FreeMonad.hs:17:10:
Non type-variable argument in the constraint: Eq (f a)
(Use FlexibleContexts to permit this)
In the context: (Functor f, Eq (f a))
While checking an instance declaration
In the instance declaration for ‘Eq (Free f a)’
Failed, modules loaded: none.
指定一個約束/前提條件(Functor f, Eq (f a))
對我來說似乎很奇怪(至少我不瘦k我以前曾將它看作是初學者)。
如何爲Free f a
定義一個Eq
實例?
現在我看到:'變量'f'在約束條件下比實例頭 更經常出現:Eq(f(Free f a))。 (使用UndecidableInstances來允許)'。還可以添加嗎? –
@KevinMeredith也可以。 UndecidableInstances可能發生的最糟糕的事情就是編譯失敗。將類型檢查器引向無限循環,但這不會發生在這裏。 GHC建議他們通常不應該打開的主要討厭擴展是[OverlappingInstances](http://stackoverflow.com/q/1064232)和[IncoherentInstances](http://stackoverflow.com/q/16050566) - 這兩個人爲廢話敞開大門。順便說一下,你做了正確的事情:BTW:大多數擴展是無害的,但你應該知道它們在做什麼以及在啓用之前是否需要它們。 – duplode