在下面的代码中,您必须编写一个函数来检查列表是否已排序。
isOrd :: [Int] -> Bool
isOrd [] = True
isOrd [_] = True
isOrd (x:y:xs) = x<=y && isOrd (y:xs)
我想知道为什么没有必要写if/then/else或case的最后一行?我们为什么不检查一下是True
还是False
呢?
如果/那么/否则你会建议写作吗?我认为应该是这样的:
isOrd (x:y:xs) = if x<=y && isOrd (y:xs)
then True
else False
但是我们知道if x then True else False
总是x
的一种特别冗长的写法。因此,这里实际上不需要任何特定的条件分支:我们可以只返回条件本身。
由(&&) :: Bool -> Bool -> Bool
检查函数:如果左操作数为False
,则返回False
。如果左操作数为True
,则返回右操作数
实际上,这个函数是这样实现的:[src]:
(&&) :: Bool -> Bool -> Bool True && x = x False && _ = False
因此,它将检查第一个操作数,并在此基础上返回False
,或对函数的其余部分进行递归。
为什么我们不需要检查它是真还是假?
因为函数的输出类型是Bool
,我们只返回Bool
作为amalloy就足够了提及。
首先,我们说空列表和只有一个元素的列表都是有序列表。然后我们说:"检查列表的第一个元素是否小于或等于第二个元素。如果不是,则返回False
。如果是,则检查没有第一个元素的相同列表是否已排序。这足以为所有输入列表返回正确的Bool
。