Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 递归类型的约束_Haskell_Types_Constraints_Recursive Type - Fatal编程技术网

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
中的var
a
类型设置约束?

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

{-# 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中引入。