为什么在这段代码的最后一行没有条件语句?



在下面的代码中,您必须编写一个函数来检查列表是否已排序。

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

最新更新