哈斯克尔,计算整数列表的乘积,如下所示:



我的任务是:

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

我只能使用列表理解。

示例: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

最新更新