Haskell: 无法匹配预期类型

Haskell: can't match expected type Either

我有以下代码,我尝试使用函数 eval3 return 和 IntBool,但我收到一条错误消息:

• Couldn't match expected type ‘Either Int Bool’
              with actual type ‘Int’

• In the expression: eval e2

  In the expression: if eval0 e1 then eval e2 else eval0 e3

  In an equation for ‘eval3’:

      eval3 (If e1 e2 e3) = if eval0 e1 then eval e2 else eval0 e3

错误:

• Couldn't match expected type ‘Either Int Bool’
              with actual type ‘Bool’

• In the expression: eval0 e3

  In the expression: if eval0 e1 then eval e2 else eval0 e3

  In an equation for ‘eval3’:

      eval3 (If e1 e2 e3) = if eval0 e1 then eval e2 else eval0 e3


{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}

data Exp = V Var
    | B Bool
    | L Exp
    | A Exp Exp
    | MyInt Int
    | And Exp Exp
    | If Exp Exp Exp
data Var = VZ |VS Var

eval :: Exp -> Int
eval (MyInt e1)     = e1

eval0 :: Exp -> Bool
eval0 (B e1) = e1


eval3 :: Exp -> Either Int Bool
eval3 (If e1 e2 e3) = if eval0 e1 then eval e2 else eval0 e3

我需要添加或更改什么才能使函数 eval3 变为 return 类型

我们不 return 两种类型,而是 Either 类型。

要构建类型 Either Int Bool 的值,可以使用 Left i where i :: IntRight b where b :: Bool。在你的情况下,

eval3 :: Exp -> Either Int Bool
eval3 (If e1 e2 e3) = if eval0 e1 then Left (eval e2) else Right (eval0 e3)

因为你有

eval :: Exp -> Int       -- eval (e2 :: Exp) :: Int

eval0 :: Exp -> Bool     -- eval0 (e3 :: Exp) :: Bool