无法构造无限类型

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)