簡體   English   中英

Haskell-使用文件夾的MinMax

[英]Haskell - MinMax using foldr

我正在尋找一個Haskell函數,該函數將列表作為參數並返回一個元組(min,max),其中min是列表的最小值,而max是最大值。

我已經有這個了:

maxMinFold :: Ord a => [a] -> (a, a)
maxMinFold list = foldr (\x (tailMin, tailMax) -> (min x tailMin) (max x tailMax)) -- missing part

您能幫我增加什么到缺少的部分嗎? (或告訴我我在做什么錯)

非常感謝

您拿起頭部並將其用作拳頭的最小值最大值,然后在尾巴上折疊。

maxMinFold :: Ord a => [a] -> (a, a)
maxMinFold (x:xs) = foldr (\x (tailMin, tailMax) -> (min x tailMin, max x tailMax)) (x,x) xs

關於您的答案,您的折疊功能沒有返回正確的類型。

注意

foldr :: (a -> b **-> b**) -> b -> [a] -> b

特別是您需要返回b ,這是您的情況下的元組

由於您始終必須遍歷整個列表以找到最小值和最大值,因此這里是foldl的解決方案:

maxMinList :: Ord a => [a] -> (a,a)
maxMinList (x:xs) = foldl (\(l,h) y -> (min l y, max h y)) (x,x) xs

為了有效地使用文件foldr

data NEList a = NEList a [a]
-- deriving (Eq, Ord, Show, Read, Functor, Foldable, Traversable)

minMax :: Ord a => NEList -> (a, a)
minMax (NEList x0 xs) = foldr go (,) xs x0 x0 where
  go x r mn mx
    | x < mn = r x mx
    | mx < x = r mn x
    | otherwise = r mn mx

另一種類似的方法:

minMaxM :: Ord a => [a] -> Maybe (a, a)
minMaxM xs = foldr go id xs Nothing where
  go x r Nothing = r (Just (x, x))
  go x r mnmx@(Just (mn, mx))
    | x < mn = r (Just (x, mx))
    | mx < x = r (Just (mn, x))
    | otherwise = r mnmx

如果在空白列表的情況下minMax函數返回Nothing ,那將是很好的。 這是執行此操作的版本。

import Control.Arrow
import Data.Maybe
import Data.Foldable

minMax :: (Ord a) => [a] -> Maybe (a,a)
minMax = foldl' (flip $ \ x -> Just . maybe (x,x) (min x *** max x)) Nothing

這使用foldl'而不是foldr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM