递归类型的约束



我有一个类型data A a = B (a (A a)).如何在函数something :: Eq (a b) => A a -> SomeType中对 vara类型进行约束?

我并不完全清楚你想要实现什么,但这编译了:

{-# LANGUAGE QuantifiedConstraints, StandaloneDeriving, UndecidableInstances #-}
data A a = B (a (A a))
deriving instance (forall t. Eq t => Eq (a t)) => Eq (A a)
something :: (forall t. Eq t => Eq (a t)) => A a -> String
something x 
| x==x      = "hello"
| otherwise = "world"

这里的诀窍是要求Eq (a t)适用于任何可能的t。这需要QuantifiedConstraints.

当然,您也可以使用更适度的方法并要求

something :: Eq (a Bool) => A a -> String

但这不允许你在参数上使用==

或者

something :: Eq (A a) => A a -> String

应该工作,即使它触发了警告。

最新更新