我的任务是:
对于数字列表,计算产品之间的差异 如果元素为正数或最大值,则为两个连续元素 否则。
我只能使用列表理解。
示例:prod [7,5,4, -3,2] == 2 * 1 * 4 * 2 == 16
prod :: [Int] -> Int
prod xs = product [ x | x <- xs, x > 0 ]
如果他们是正数,我不知道如何让下一个角色产生差异。有人可以指导我一点吗?
答案 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