在通过特定测试的子列表上执行操作

时间:2016-11-07 15:40:53

标签: haskell functional-programming

我正在尝试编写一个函数,当给出两个数字和它们所属的列表时,会计算这些数字之间的所有内容(值)。

例如:

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

现在我有点卡住,我无法找到一种方法来“过滤”我的列表。任何帮助,将不胜感激。 〜

1 个答案:

答案 0 :(得分: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}}