Haskell 递归类型的约束
我有一个类型Haskell 递归类型的约束,haskell,types,constraints,recursive-type,Haskell,Types,Constraints,Recursive Type,我有一个类型数据a=B(a(a))。如何对函数something::Eq(ab)=>a a->SomeType中的vara类型设置约束?我不完全清楚您想要实现什么,但这编译了: {-# LANGUAGE QuantifiedConstraints, StandaloneDeriving, UndecidableInstances #-} data A a = B (a (A a)) deriving instance (forall t. Eq t => Eq (a t)) =>
数据a=B(a(a))
。如何对函数something::Eq(ab)=>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"
这里的诀窍是要求对任何可能的t
保持Eq(at)
。这需要量化约束
当然,您也可以使用更温和的方法,并要求
something :: Eq (a Bool) => A a -> String
但这不允许您在参数上使用==
或者
something :: Eq (A a) => A a -> String
应该有效,即使它触发了警告。假设您在实现
某物时实际使用了Eq(a(a))
(而不是Eq(a b)
(对于一些任意的b
),不?我以前没有看到量化约束,所以谢谢。这对我有用me@WilliamRusnack大约一年前才在GHC 8.6.1中引入。