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
相关产品推荐
相关产品推荐

