2016-11-07 28 views
2

我想寫一個函數,當給出兩個數字和他們屬於的列表時,將計算這些數字(值)之間的所有內容。對通過某個測試的子列表執行操作

例如:

averageBetween 4 8 [1,2,8,2,7,2,4,6] =平均[4,6,7,8] = 6,25

我已經設法到目前爲止做的是:

average::[Int]->Double 
average [] = 0 
average xs = (fromIntegral (sum xs))/(fromIntegral (length xs) 
averageBetween::Int->Int->[Int]->Double 
averageBetween a b xs 

現在我有點卡住了,我真的不能想出一個辦法來「過濾器」我的名單。任何幫助,將不勝感激。 〜

+2

爲什麼你確實不使用'filter'作爲預處理步驟?正如'averageBetween list = postProcess $ filter(\ x - > somePredicateOn x)list' – chi

+0

是的,謝謝。 – Rad

回答

1

好消息是,除了缺少右括號外,您的average函數還可以按預期工作,並且可以在您的averageBetween函數中使用。要查找列表中給定的ab之間的值的平均值,我們需要過濾列表,如您所述,消除大於max a b且小於min a b的值。如果我們的觀點相反,這很重要。因此,我們的謂語會是這個樣子:

(\x -> (x >= (min a b)) && (x <= (max a b))) 

然後,我們可以調用我們average功能過濾列表上,產生我們最後的函數定義:

average :: [Int] -> Double 
average [] = 0 
average xs = (fromIntegral (sum xs))/(fromIntegral (length xs)) 

averageBetween :: Int -> Int -> [Int] -> Double 
averageBetween a b xs = average $ filter (\x -> (x >= (min a b)) && (x <= (max a b))) xs 

哪些可以用來就像你會預計:

ghci>> averageBetween 4 8 [1,2,8,2,7,2,4,6] 
6.25 
+1

謝謝,幫助。我諮詢了haskell的文檔,但我想「過濾器」功能超過了我的頭。我將來會注意到這一點。 – Rad

+3

@Rad也許你已經知道它了,但在這種情況下的另一個選項是[Hoogle](https://www.haskell.org/hoogle/),它不僅可以按名稱搜索,還可以按類型簽名(嘗試「 a - > Bool) - > [a] - > [a]')。 haskell.org上的Hoogle實例默認只在「標準」庫中進行搜索。如果你需要更廣泛的軟件包,你可以試試[Stackage的Hoogle](https://www.stackage.org/lts)。 – duplode

+1

請注意,更容易閱讀(也可能同樣高效)將兩個調用組成'filter'。平均值在b =平均值之間。過濾器(> =(min a b))。過濾器(<=(max a b))'。 – chepner

相關問題