Haskell 使用Foldr定义最小函数

Haskell 使用Foldr定义最小函数,haskell,functional-programming,Haskell,Functional Programming,我想定义min函数,使用Foldr函数获取列表中的最小数 min xs = foldr (\ x y -> if x<y then x else y) xs 我不知道如何为min之类的函数执行此操作foldr的类型签名是: foldr :: (a -> b -> b) -> b -> [a] -> b 特别是,foldr包含三个参数,因此缺少对min的定义 一个值: min xs = foldr (\ x y -> if x<y th

我想定义min函数,使用Foldr函数获取列表中的最小数

min xs  = foldr (\ x y -> if x<y then x else y) xs

我不知道如何为min之类的函数执行此操作
foldr
的类型签名是:

foldr :: (a -> b -> b) -> b -> [a] -> b
特别是,
foldr
包含三个参数,因此缺少对
min
的定义 一个值:

min xs  = foldr (\ x y -> if x<y then x else y) ??? xs

确定什么???应该是,问问你自己:
min(a:as)
as=[]
时应该是什么?

foldr的类型签名是:

foldr :: (a -> b -> b) -> b -> [a] -> b
特别是,
foldr
包含三个参数,因此缺少对
min
的定义 一个值:

min xs  = foldr (\ x y -> if x<y then x else y) ??? xs

确定什么???应该是,问问自己:当
as=[]
时,
min(a:as)
应该是什么?

min
最好被看作是左折而不是右折。右折叠方法的问题在于,在完全遍历列表之前,不会进行比较。如果列表是惰性生成的,这将导致大量的内存使用过量。即使不是这样,也可能会导致缓存使用不当和总体速度缓慢。这个答案的其余部分就不那么实际了

如图所示,实际上可以根据
foldr
编写
foldl

foldl :: (a -> b -> a) -> a -> [b] -> a
foldl f a bs =
   foldr (\b g x -> g (f x b)) id bs a
一般来说,这不会是一个很好的实现,但最近在程序转换方面的发展实际上使它工作得很好,很明显,尽管可能不是在实际发布的编译器中

然后

现在写

min2 x y
  | x <= y = x
  | otherwise = y
这样我们就可以写作了

min (a:as) = foldr (\b g x -> g (min2 x b)) id as a

(在前沿研究编译器上)这可能是使用
foldr
来实现
min

min
的最佳方法。最好将
min
视为左折,而不是右折。右折叠方法的问题在于,在完全遍历列表之前,不会进行比较。如果列表是惰性生成的,这将导致大量的内存使用过量。即使不是这样,也可能会导致缓存使用不当和总体速度缓慢。这个答案的其余部分就不那么实际了

如图所示,实际上可以根据
foldr
编写
foldl

foldl :: (a -> b -> a) -> a -> [b] -> a
foldl f a bs =
   foldr (\b g x -> g (f x b)) id bs a
一般来说,这不会是一个很好的实现,但最近在程序转换方面的发展实际上使它工作得很好,很明显,尽管可能不是在实际发布的编译器中

然后

现在写

min2 x y
  | x <= y = x
  | otherwise = y
这样我们就可以写作了

min (a:as) = foldr (\b g x -> g (min2 x b)) id as a

(在前沿研究编译器上)这可能是使用
foldr
实现
min

的最佳方法。请注意,您也可以使用
foldr1
函数,该函数正是为此目的而存在的。@user5402当列表为空[]时,我可以不使用任何值吗?@AhmedFayed-当然,如果您的
min
签名是
[a]>可能是a
。实际上,@AhmedFayed,您应该使用
foldl1
功能。单个项目的情况是:
min[a]=a
。在可能的情况下,我定义
min=foldr(请注意,您也可以使用
foldr1
函数,该函数正是为此目的而存在的。@user5402当列表为空[]时,我可以不使用任何值吗?@AhmedFayed-当然,如果
min
的签名为
[a]->可能是一个
。实际上,@AhmedFayed,你应该使用
foldl1
功能。单个项目的情况是:
min[a]=a
。在可能的情况下,我定义
min=foldr(据我所知,这实际上是当前GHC 7.9中的
foldl
的实现。但是,它可能要到明年初才会在GHC的发布版本中发布。感谢您提供的信息,@Carl!据我所知,这实际上是当前GHC 7.9中的
foldl
的实现。然而,它不会在发布版本中发布。)GHC的版本可能到明年初。感谢您提供的信息,@Carl!
min
已经在Data.Ord中定义。尽管看起来您可能需要Data.List中的
minimum
。Latites是半群,
可能将半群提升为幺半群,因此您也可以定义一个min幺半群并使用
Data.Foldable.foldMap
min
已在Data.Ord中定义。尽管看起来您可能需要Data.List中的
minimum
。关系是半群,
可能将半群提升为幺半群,因此您也可以定义min幺半群并使用
Data.Foldable.foldMap