Haskell,计算这样的整数列表的乘积:

时间:2017-05-10 10:56:25

标签: haskell

我的任务是:

  

对于数字列表,计算产品之间的差异   如果元素为正数或最大值,则为两个连续元素   否则。

我只能使用列表理解。

示例:prod [7,5,4, -3,2] == 2 * 1 * 4 * 2 == 16

prod :: [Int] -> Int
prod xs = product [ x | x <- xs, x > 0 ]

如果他们是正数,我不知道如何让下一个角色产生差异。有人可以指导我一点吗?

1 个答案:

答案 0 :(得分:3)

这里出现两个问题:

  • 获得每两个连续的数字;和
  • 计算差异或最大值。

我的猜测是,分别解决这个问题会更好。第二个可以通过使用单独的函数来解决:diff_or_max例如:

diff_or_max :: (Num a, Ord a) => a -> a -> a
diff_or_max x y | x >= 0 && y >= 0 = abs (x-y)
                | otherwise = max x y

使用tails模块的Data.List函数可以解决第一个问题:

import Data.List(tails)

special_prod :: (Num a, Ord a) => [a] -> a
special_prod xs = product [ diff_or_max x x2 | (x:x2:_) <- tails xs ]

这会产生:

*Main Data.List> special_prod [7,5,4, -3,2] 
16