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

Haskell中实现比较输入值返回(String,Int)二元组非匹配元素的问题

原有代码核心问题

你写的代码逻辑符合需求,但类型签名存在两处致命错误,会直接导致编译失败:

  • Haskell 中==运算符要求两端操作数类型完全一致,你传入的a类型值要同时和String类型的第一个元组元素、Int类型的第二个元组元素判等,在类型系统层面无法成立。
  • 返回值中的类型变量b没有任何来源约束,也不符合你的功能定义:匹配成功时返回的另一元素要么是String要么是Int,匹配失败时返回的是原(String, Int)二元组,和你写的(b,a)完全不对应。

修正实现

我们可以先定义代数数据类型统一包装二元组的可能元素类型,解决类型匹配问题:

-- 派生Eq支持判等,派生Show支持调试打印
data PairElement = Str String | Num Int deriving (Eq, Show)

-- 修正后的函数类型签名
getOtherPairValue :: (String, Int) -> PairElement -> Either PairElement (String, Int)
getOtherPairValue (s, i) e
  | e == Num i = Left $ Str s
  | e == Str s = Left $ Num i
  | otherwise = Right (s, i)

调用示例

-- 匹配字符串元素,返回对应的Int值
getOtherPairValue ("test", 123) (Str "test") -- 输出 Left (Num 123)
-- 匹配数字元素,返回对应的String值
getOtherPairValue ("test", 123) (Num 123) -- 输出 Left (Str "test")
-- 无匹配,返回原二元组
getOtherPairValue ("test", 123) (Str "other") -- 输出 Right ("test",123)

如果需要支持任意Eq类型的输入,可以额外加Typeable约束做动态类型转换,普通场景下上述方案即可完全满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:45:06