我刚刚写了一个函数,它将接受元组的输入,其中第一个元素是字符串,第二个元素是数字。比如(String,Int(。该函数应该将";Int;值,以检查它是否大于或小于某个值。只是玩了一下,我意识到以下函数的定义是有效的。
check :: (String, Int) -> Grade
check (course, mark)
| (course, mark) < (course, 50) = Fail
| otherwise = Pass
这个函数在检查整数值时似乎起作用。但我不明白为什么这样有效?元组中的字符串发生了什么?如何将字符串与自身进行比较?如果有人能帮我了解发生了什么,我将不胜感激
元组的<
的定义等价于以下内容:
instance (Ord a, Ord b) => Ord (a,b) where
(x,y) < (x',y')
| x<x' = True
| x==x' = y<y'
| otherwise = False
这被称为字典排序。
在您的代码中,您通常处于x==x'
分支,因为course==course
保持(至少对于有限字符串(。这是一个不必要的比较,更好和等效的方法是直接比较mark
,甚至不匹配course
:
check :: (String, Int) -> Grade
check (_, mark)
| mark < 50 = Fail
| otherwise = Pass