Haskell: 无法匹配预期类型
Haskell: can't match expected type Either
我有以下代码,我尝试使用函数 eval3
return 和 Int
或 Bool
,但我收到一条错误消息:
• 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 :: Int
或 Right 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
我有以下代码,我尝试使用函数 eval3
return 和 Int
或 Bool
,但我收到一条错误消息:
• 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 :: Int
或 Right 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