我正在尝试编写一个函数,当给出两个数字和它们所属的列表时,会计算这些数字之间的所有内容(值)。
例如:
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
现在我有点卡住,我无法找到一种方法来“过滤”我的列表。任何帮助,将不胜感激。 〜
答案 0 :(得分:1)
好消息是,除了缺少右括号外,您的average
函数按预期工作,可以在averageBetween
函数中使用。要查找列表中给定a
和b
之间的值的平均值,我们需要按照您的说明过滤列表,从而消除大于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}}