查找列表中的最大列表

xnv*_*v23 2 haskell functional-programming

我试图在列表中获得具有最大总和的列表,然后返回该列表.但是当我用这个函数调用时

max_list [[1,2],[3,6],[10,34,5]] 
Run Code Online (Sandbox Code Playgroud)

它给了我错误:

Exception: a4.hs:65:1-64: Non-exhaustive patterns in function max_list
Run Code Online (Sandbox Code Playgroud)

这是代码:

max_num :: [Int] -> Int
max_num [x] = x
max_num (x:xs) | (max_num xs) > x = maxVal xs
               | otherwise        = x

max_list :: [[Int]] -> [Int]
max_list [[a]] = head(filter (\x -> (sum_int x) == (max_num [[a]]) [[a]])
Run Code Online (Sandbox Code Playgroud)

我的逻辑如下:我愿意

  1. 对子列表中的元素求和
  2. 比较该元素以查看它是否等于列表的最大值
  3. 过滤掉不等于最大值的值

示例电话:

head (filter (\x -> (sum x) == 11) [[1,3],[4,7],[2,5]])
> [4,7]
Run Code Online (Sandbox Code Playgroud)

所以在那种情况下,我计算了手中的值11,并且每个元素的总和是[4,11,7],它将给出其总和等于最大值的值

Ada*_*ith 7

使用签名Data.List调用函数maximumBy

maximumBy :: (a -> a -> Ordering) -> [a] -> a
Run Code Online (Sandbox Code Playgroud)

Data.Functionon签名

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
Run Code Online (Sandbox Code Playgroud)

应用compare函数(compare :: Ord a => a -> a -> Ordering),我们可以看到这正是您正在寻找的.

import Data.List     (maximumBy)
import Data.Function (on)

{- for clarity:
   compare          :: Ord a          => b -> b -> Ordering
   (compare `on`)   :: Ord b          => (a -> b) -> a  ->  a  -> Ordering
   compare `on` sum :: (Num a, Ord a) =>            [a] -> [a] -> Ordering
   -- well actually [a] is t a for a foldable t, but same diff -}
result = maximumBy (compare `on` sum) [[1,2],[3,6],[10,34,5]] 
Run Code Online (Sandbox Code Playgroud)

为了自己实现这个,你可以写一个折叠,根据它的总和来比较每个值,递归直到总和x大于之后的任何值.

myMaximumBySum []     = [] -- degenerate case
myMaximumBySum [x]    = x  -- tautological case
myMaximumBySum (x:xs)
  | sum x > sum (myMaximumBySum xs) = x
  | otherwise                       = myMaximumBySum xs

-- or more naturally:
myMaximumBySum = foldr f []
  where f x acc = if sum x > sum acc then x else acc
Run Code Online (Sandbox Code Playgroud)

  • @ rjpj1998:对不起,我的意思是类型是*不是那个,但是`maximumBy :: Foldable t =>(a - > a - > Ordering) - > ta - > a`,而`sum`不是与`a - > a - > Ordering`匹配. (3认同)