我有一个类型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
应该工作,即使它触发了警告。