我認為case of很簡單,因為我來自更多命令式語言。盡管如此,我遇到了一個 Kata,其中另一個用戶的解決方案之一讓我對 case 的使用感到困惑,并且Data.List (sort)
import Data.List (sort)
isTriangle :: Int -> Int -> Int -> Bool
isTriangle a b c =
case sort [a,b,c] of
[min, middle, max] -> (min middle) > max
根據定義,如果a b > c滿足 [a,b,c] 的 3 個排列的條件,則 3 個線段可以構成一個三角形,因此,更直接的(我的答案)將是:
isTriangle :: Int -> Int -> Int -> Bool
isTriangle a b c = a b > c && b c > a && a c > b
我的問題是,在上述情況下,如何case of測驗 3 種組合的條件?
uj5u.com熱心網友回復:
想象一下 ab 和 c 從小到大排序,然后演算法測驗a b > c,這是第一個實作檢查的。
如果我們知道a < b < c,并且a b > c成立,那么我們知道a c > b成立。事實上:a c > a b > c > b,因此a c > b成立,因為a b > c成立。此外b c > a b > c > a成立,因此b c > a 也成立。
因此,這意味著檢查它是否適用于已知的最小值、最大值和介于兩者之間的值,則暗示了其他兩個等式。
什么case … of在這里所做的是串列進行排序,[a, b, c]并在拆包排序串列min,middle并且max,它因此是用于指定最小值為工具min,最大的價值max和剩余價值middle。A where …orlet … in …可能更優雅,例如:
isTriangle :: Int -> Int -> Int -> Bool
isTriangle a b c = (min middle) > max
where [min, middle, max] = sort [a, b, c]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342916.html
標籤:哈斯克尔
上一篇:HaskellADT相互依賴
