Expected type与Actual type不匹配:Var类型参数调用Int函数报错如何解决
问题根本原因
- 你的
Var类型定义不符合代数数据类型语法:data Var = String | Int仅定义了两个无参的Var类型构造器(名为String/Int),和Haskell内置的Int/String类型没有任何关联,也没有存储实际数值的字段。你匹配到Int构造器时,变量b的类型仍然是Var,自然不满足Increment要求的Int入参要求。 - 你此前的「已判断b为Int类型」的认知存在偏差:你仅判断了b是
Var类型下的Int构造器实例,b本身从未属于内置Int类型。
可行解决方案
首先修正Var类型定义,给构造器增加对应类型的字段存储实际值,建议将构造器改名避免和内置类型混淆:
data Var = VInt Int | VString String
随后修正Compute函数的case匹配逻辑,匹配时取出构造器包裹的实际Int值再传入Increment:
-- 补充:Haskell规范要求函数名首字母小写,此处按规范修正命名 increment :: Int -> Int increment a = a + 1 compute :: Var -> Maybe Int compute b = case b of VInt val -> Just (increment val) VString _ -> Nothing
如果确实需要保留Int/String作为构造器名(非常不推荐,极易和内置类型混淆),也可以按以下方式编写:
-- 仅作示例,不推荐生产环境使用 data Var = Int Int | String String compute :: Var -> Maybe Int compute b = case b of Int val -> Just (increment val) String _ -> Nothing
补充说明:Haskell语法要求函数名首字母必须小写,类型、构造器名首字母必须大写,原代码中的
Increment、Compute按规范必须改为小写开头,否则会额外触发编译错误。
内容的提问来源于stack exchange,提问作者Ben Borg
相关产品推荐
相关产品推荐

