在下面的代碼中,您必須撰寫一個函式來檢查串列是否已排序。
isOrd :: [Int] -> Bool
isOrd [] = True
isOrd [_] = True
isOrd (x:y:xs) = x<=y && isOrd (y:xs)
我想知道為什么最后一行不需要寫 if/then/else 或 case?為什么我們不需要檢查它是否是Trueor False?
uj5u.com熱心網友回復:
如果/那么/否則你會建議寫作嗎?我想象的那個看起來像這樣:
isOrd (x:y:xs) = if x<=y && isOrd (y:xs)
then True
else False
但我們知道,這if x then True else False始終只是一種特別冗長的寫作方式x。所以這里實際上不需要特定的條件分支:我們可以只回傳條件本身。
uj5u.com熱心網友回復:
這由(&&) :: Bool -> Bool -> Bool函式檢查:如果左運算元是False,則回傳False。如果左運算元是True,則回傳右運算元。
實際上,該函式實作為 [src]:
(&&) :: Bool -> Bool -> Bool True && x = x False && _ = False
因此,它將檢查第一個運算元,并基于該操作 returnFalse或遞回函式的其余部分。
uj5u.com熱心網友回復:
比如為什么我們不需要檢查它是真還是假?
因為函式的輸出型別是Bool,我們只需要回傳上面提到Bool的amalloy就足夠了。
所以,首先我們說空串列和一個元素的串列是有序串列。然后我們說:“檢查串列的第一個元素是否小于或等于第二個元素。如果不是,則回傳False。如果是,則檢查沒有第一個元素的相同串列是否已排序”。這足以回傳Bool所有輸入串列的權限。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474039.html
標籤:哈斯克尔
上一篇:Haskell-按第一個第二個元素排序,然后按第一個元素
下一篇:Haskell中的多型值映射
