无法构造无限类型
Cannot construct inifnite type
data Prop = a | b | c | d
deriving (Show, Eq)
data Wrapper =
Wtail
| Wrap prop
| Mrappe Wrapper Wrapper
deriving (Show, Eq)
fold_wrap :: (a -> a -> a) -> (Prop -> a) -> a -> Wrapper -> a
fold_wrap v x z (Mrappe l r) = v ( v(v x z l) v(v x z r) )
fold_wrap v x z (Wrap f) = x f
fold_warp v x z (Wtail ) = z
上面的代码出现以下错误:
ghc mast.hs
[1 of 1] Compiling Main ( mast.hs, mast.o )
mast.hs:13:39: error:
• Occurs check: cannot construct the infinite type: a ~ Prop -> a
• In the first argument of ‘v’, namely ‘x’
In the first argument of ‘v’, namely ‘(v x z l)’
In the first argument of ‘v’, namely ‘(v (v x z l) v (v x z r))’
• Relevant bindings include
z :: a (bound at mast.hs:13:15)
x :: Prop -> a (bound at mast.hs:13:13)
v :: a -> a -> a (bound at mast.hs:13:11)
fold_mast :: (a -> a -> a) -> (Prop -> a) -> a -> Wrapper -> a
(bound at mast.hs:13:1)
|
13 | fold_mast v x z (Wrapper l r) = v ( v(v x z l) v(v x z r) )
| ^
我看过:
Why does this Haskell code produce the "infinite type" error?
如果我理解正确的话,我不能将我的 v
函数放入我的 fold_wrap
中,因为它会允许无限递归。
方法fold_wrap
应该折叠树状结构Wrapper
,其中wtail
应该指向一个预先配置的常量值,Wrap
有值并且Mrappe
是什么使数据结构像树一样。
我的问题是:
如何避免此 "cannot construct the infinite type" 错误?
这看起来不对
fold_wrap v x z (Mrappe l r) = v ( v(v x z l) v(v x z r) )
v
接受两个 a
个参数,而 x, z, l
是 三个 个参数。而且x, l
还没有打字a
。
实际上,x
具有类型 Prop -> a
,等同于 a ~ Prop -> a
会导致无效的 "infinite" 类型。
你反而想在那里递归:
fold_wrap v x z (Mrappe l r) = v (fold_wrap v x z l) (fold_wrap v x z r)
data Prop = a | b | c | d
deriving (Show, Eq)
data Wrapper =
Wtail
| Wrap prop
| Mrappe Wrapper Wrapper
deriving (Show, Eq)
fold_wrap :: (a -> a -> a) -> (Prop -> a) -> a -> Wrapper -> a
fold_wrap v x z (Mrappe l r) = v ( v(v x z l) v(v x z r) )
fold_wrap v x z (Wrap f) = x f
fold_warp v x z (Wtail ) = z
上面的代码出现以下错误:
ghc mast.hs
[1 of 1] Compiling Main ( mast.hs, mast.o )
mast.hs:13:39: error:
• Occurs check: cannot construct the infinite type: a ~ Prop -> a
• In the first argument of ‘v’, namely ‘x’
In the first argument of ‘v’, namely ‘(v x z l)’
In the first argument of ‘v’, namely ‘(v (v x z l) v (v x z r))’
• Relevant bindings include
z :: a (bound at mast.hs:13:15)
x :: Prop -> a (bound at mast.hs:13:13)
v :: a -> a -> a (bound at mast.hs:13:11)
fold_mast :: (a -> a -> a) -> (Prop -> a) -> a -> Wrapper -> a
(bound at mast.hs:13:1)
|
13 | fold_mast v x z (Wrapper l r) = v ( v(v x z l) v(v x z r) )
| ^
我看过:
Why does this Haskell code produce the "infinite type" error?
如果我理解正确的话,我不能将我的 v
函数放入我的 fold_wrap
中,因为它会允许无限递归。
方法fold_wrap
应该折叠树状结构Wrapper
,其中wtail
应该指向一个预先配置的常量值,Wrap
有值并且Mrappe
是什么使数据结构像树一样。
我的问题是:
如何避免此 "cannot construct the infinite type" 错误?
这看起来不对
fold_wrap v x z (Mrappe l r) = v ( v(v x z l) v(v x z r) )
v
接受两个 a
个参数,而 x, z, l
是 三个 个参数。而且x, l
还没有打字a
。
实际上,x
具有类型 Prop -> a
,等同于 a ~ Prop -> a
会导致无效的 "infinite" 类型。
你反而想在那里递归:
fold_wrap v x z (Mrappe l r) = v (fold_wrap v x z l) (fold_wrap v x z r)