我的任务是:
对于数字列表,计算两者之差的乘积 两个连续的元素,如果元素为正或最大值 元素,否则。
我只能使用列表理解。
示例:prod [7,5,4, -3,2] == 2 * 1 * 4 * 2 == 16
prod :: [Int] -> Int
prod xs = product [ x | x <- xs, x > 0 ]
如果它们是正数,我不知道如何取下一个字符来区分。有人可以指导我一下吗?
这里出现了两个问题:
- 每获得两个连续的数字;和
- 计算差值或最大值。
我的猜测是,最好单独解决此问题。第二个问题最好通过使用单独的函数来解决:例如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
第一个问题可以通过使用Data.List
模块的tails
函数来解决:
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