You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:45:04