Haskell中(String, Int)元组比较为何仅判断Int值的疑问
关于Haskell元组比较规则的解释
核心原理:Haskell的元组比较逻辑
Haskell里的元组比较是按元素顺序逐位进行的短路比较:
- 先比较两个元组的第一个元素,如果不相等,直接根据第一个元素的比较结果返回整体的比较结果,后面的元素不会被比较;
- 只有当第一个元素相等时,才会继续比较第二个元素,以此类推。
你的代码为什么不受String部分影响
在你的代码里,比较的是(course, mark)和(course, 50):
- 两个元组的第一个元素都是同一个变量
course,所以它们的String值必然完全相等; - 因为第一个元素相等,Haskell会继续比较第二个元素,也就是
mark和50的大小,最终的比较结果完全由这两个Int值决定,String部分因为两边完全一致,所以不会对结果产生任何影响。
优化建议
这种通过元组比较的写法虽然能工作,但可读性较差,完全可以直接比较Int值,代码更清晰:
check :: (String, Int) -> Grade check (course, mark) | mark < 50 = Fail | otherwise = Pass
内容的提问来源于stack exchange,提问作者Seeker
相关产品推荐
相关产品推荐

