對此的任何幫助將不勝感激。
我正在嘗試在 Haskell 中撰寫一個函式來查找三個數字中有多少大于所述三個數字的平均值。
問題是,我試圖使用警衛來增加“總和”,但我假設警衛只去第一個條件是真的。有一個更好的方法嗎?
這是我的代碼:
howManyAboveAverage :: Int -> Int -> Int -> Int
howManyAboveAverage x y z | aboveAverage x = sum 1
| aboveAverage y = sum 1
| aboveAverage z = sum 1
where
aboveAverage a = a > div (x y z) 3
sum = 0
uj5u.com熱心網友回復:
您可以總結條件并將 a 轉換Bool為Intwith fromEnum :: Enum a => a -> Bool:
howManyAboveAverage :: Int -> Int -> Int -> Int
howManyAboveAverage x y z = sum (map (fromEnum . (avg <)) [x, y, z])
where avg = div (x y z) 3
或者正如@luqui 所說,使用length:
howManyAboveAverage :: Int -> Int -> Int -> Int
howManyAboveAverage x y z = length (filter (avg <) [x, y, z])
where avg = div (x y z) 3
uj5u.com熱心網友回復:
是的,只是寫得不同,因為
howManyAboveAverage :: Int -> Int -> Int -> Int
howManyAboveAverage x y z = aboveAverage x
aboveAverage y
aboveAverage z
where
avg = div (x y z) 3
aboveAverage a
| a > avg = 1
| otherwise = 0
在面向運算式的編程中,我們不設定和改變全域變數,我們安排運算式具有相同的最終預期值。
現在您可以調整和簡化。特別是,一種不那么 hacky 的方式是
howManyAboveAverage :: Int -> Int -> Int -> Int
howManyAboveAverage x y z = length $
aboveAverage x
aboveAverage y
aboveAverage z
where
avg = div (x y z) 3
aboveAverage a = [a | a > avg]
x & f = f x
作為一種選擇,這可以轉化為一個很好的串列理解。
或者如果那是你的事,那就讓它更復雜、更遲鈍、更不可讀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/431376.html
標籤:哈斯克尔
