如何在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]]
答案 0 :(得分:3)
它不起作用的原因是因为func4
期望 - 就像你自己说的那样 - 列表。所以[[x,y]]
是一个列表列表。现在,这意味着[x,y]
是项目的列表。您无法确切知道x
和y
是哪些列表,您可以从中计算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)
您可以在此处对项目进行模式匹配,它必须是包含两个元素x
和y
的列表,然后map
上的max x y
。如果必须映射不包含正好两个元素的列表,则此函数将出错。 \[x,y] -> max x y
称为 lambda表达式。