Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用foldr的Haskell-MinMax_Haskell - Fatal编程技术网

使用foldr的Haskell-MinMax

使用foldr的Haskell-MinMax,haskell,Haskell,我正在寻找一个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 你能帮我补充一下缺失的部分吗?(或者告诉我我做错了什么) 非常感

我正在寻找一个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
你能帮我补充一下缺失的部分吗?(或者告诉我我做错了什么)


非常感谢

你拿着头,用它作为第一个minmax,然后把尾巴折叠起来

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

特别是,您需要返回a
b
,在您的情况下,这是一个元组

您将头部作为第一个最小值和最大值,然后折叠尾部

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

特别是,您需要返回a
b
,在您的情况下,这是一个元组

,因为您必须始终遍历整个列表以找到最小值和最大值,这是使用
foldl
的解决方案:

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

因为您总是需要遍历整个列表才能找到最小值和最大值,所以这里是使用
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
数据NEList a=NEList a[a]
--派生(Eq、Ord、Show、Read、Functor、可折叠、可遍历)
最小值::Ord a=>NEList->(a,a)
最小值(NEList x0 xs)=foldr go(,)xs x0其中
go x r mn mx
|x
另一种类似的方法:

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
minMaxM::Ord a=>[a]->可能(a,a)
minMaxM xs=foldr go id xs Nothing where
go x r Nothing=r(只是(x,x))
go x r mnmx@(仅(mn,mx))
|x
要有效地使用
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
数据NEList a=NEList a[a]
--派生(Eq、Ord、Show、Read、Functor、可折叠、可遍历)
最小值::Ord a=>NEList->(a,a)
最小值(NEList x0 xs)=foldr go(,)xs x0其中
go x r mn mx
|x
另一种类似的方法:

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
minMaxM::Ord a=>[a]->可能(a,a)
minMaxM xs=foldr go id xs Nothing where
go x r Nothing=r(只是(x,x))
go x r mnmx@(仅(mn,mx))
|x
如果在空列表的情况下,
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

如果
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

谢谢,这很有帮助。只是一个问题——为什么这不起作用
maxMinFold list=foldr(\x(tailMin,tailMax)->(min x tailMin)(max x tailMax))(head list,head list)list
(min x tailMin)(max x tailMax)
不是有类型的东西,更不用说元组类型了。我对我的回答补充了一点谢谢,这很有帮助。只是一个问题——为什么这不起作用
maxMinFold list=foldr(\x(tailMin,tailMax)->(min x tailMin)(max x tailMax))(head list,head list)list
(min x tailMin)(max x tailMax)
不是有类型的东西,更不用说元组类型了。我在我的答案上加了一点。。。且
设ma=min l y;mb=max h y in ma'seq'mb'seq´(ma,mb)
只要我们是学究,就有一些类型不必遍历整个列表,特别是具有最小和/或最大元素的类型。。。。且
设ma=min l y;mb=maxhy在ma'seq'mb'seq´(ma,mb)
只要我们是学究,就有一些类型不必遍历整个列表,特别是具有最小和/或最大元素的类型。