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

