计算列表列表的每个列表的最大值

时间:2017-03-26 16:06:27

标签: list haskell max

如何在Haskell中定义一个函数,它获取双精度列表的列表,并使用map返回每个列表的最高值?

像这样:func4 [[2,4],[4,7],[7,9]] = [4,7,9]

我试图在很多方面做到这一点,但它出错了。是否可以执行此操作?

func4 [[x,y]] = map maximum [x,y]

func4 [[x,y]] = [xs| xs <- map maximum [x,y]]

1 个答案:

答案 0 :(得分:3)

它不起作用的原因是因为func4期望 - 就像你自己说的那样 - 列表。所以[[x,y]]是一个列表列表。现在,这意味着[x,y]项目的列表。您无法确切知道xy是哪些列表,您可以从中计算maximum(即使有效,也不正确)。

您可以简单地省略[[x,y]]模式并使用l(列表列表),例如:

func4 :: Ord b => [[b]] -> [b]
func4 l = map maximum l

甚至更好,使用 eta-reduction

-- with eta-reduction

func4 :: Ord b => [[b]] -> [b]
func4 = map maximum -- look mom... no variables

如果要求每个列表只包含两个元素,您还可以使用:

func4 :: Ord b => [[b]] -> [b]
func4 = map (\[x,y] -> max x y)

您可以在此处对项目进行模式匹配,它必须是包含两个元素xy的列表,然后map上的max x y。如果必须映射不包含正好两个元素的列表,则此函数将出错。 \[x,y] -> max x y称为 lambda表达式