Haskell 使用Foldr定义最小函数
我想定义min函数,使用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 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
来实现minmin
的最佳方法。最好将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
。