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

Haskell判断Sign类型为Charlie构造子及提取CharlieTwo字段问题

错误原因说明

你遇到的类型错误本质是:Charlie 是Sign类型的构造函数,需要传入三个参数才能得到Sign类型的值,你直接把未传参的Charlie和Sign类型的sign比较,自然类型不匹配。另外Haskell中判断值属于哪个构造子的常规做法是模式匹配,不需要用相等判断。


问题1:判断sign是否为Charlie构造的实例

直接在foo的参数匹配里嵌套对sign的模式匹配即可,不需要用守卫语句的相等判断:

foo :: Code -> Bool
-- 直接匹配sign是Charlie构造的情况,同时绑定三个参数的变量
foo (C (Charlie c1 c2 c3) _) =  -- 这里匹配到就说明是Charlie构造的实例
  -- 后续逻辑
foo (C _ _) = -- 其他构造子的逻辑

如果你确实需要在守卫里判断,可以用守卫模式匹配写法:

foo :: Code -> Bool
foo (C sign _)
  | Charlie _ _ _ <- sign = -- 匹配到就说明是Charlie构造的
    ...

问题2:获取CharlieTwo字段调用函数

首先你原有代码里的coo类型定义存在错误:Charlie是构造子不是类型,不存在Charlie这个类型。如果你要接收Charlie构造的Sign值,coo的类型应该是Sign -> Bool;如果你只是需要传CharlieTwo字段(也就是String类型的值),直接把模式匹配绑定的变量传参即可。
示例代码如下:

-- 方式1:直接把CharlieTwo当参数传给其他函数
coo :: CharlieTwo -> Bool -- CharlieTwo是String的别名
coo str = undefined -- 替换为你的业务逻辑

foo :: Code -> Bool
foo (C (Charlie _ c2 _) _) = coo c2 -- 直接取绑定的c2传参
foo (C _ _) = undefined -- 其他情况的逻辑

-- 方式2:coo接收Sign类型的Charlie值,自己内部取字段
coo :: Sign -> Bool
coo (Charlie _ c2 _) = undefined -- 内部直接拿到c2使用
coo _ = undefined -- 其他构造子的处理逻辑

foo :: Code -> Bool
foo (C sign@(Charlie _ _ _) _) = coo sign -- 把匹配到的Charlie构造的sign直接传参
foo (C _ _) = undefined

内容的提问来源于stack exchange,提问作者CoffeeKid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:54:04