[英]Maximizing according to a function
我试图编写一个接受函数和两个输入的函数,并返回最大化函数的参数。 这是我想要使用的设置:
max :: Eq a => (a -> Int) -> a -> a -> a
例如,该函数应该如下工作:
maximize (+3) 5 10 = 10
因为(3 + 5)<(3 + 10)
我想我需要做这样的事情:
maximize :: Eq a => (a -> Int) -> a -> a -> a
maximize f x y = max (f x) (f y)
这种方法似乎并没有起作用。 感谢您的任何帮助!
你的问题是max (fx) (fy)
返回fx
或fy
,而不是x
或y
。 你必须比较前一对值然后返回后者之一。 一种方法是在结果上使用compare
然后模式匹配,如下所示:
-- You don't actually need the `Eq a` constraint here.
maximize :: (a -> Int) -> a -> a -> a
maximize f x y = case compare (f x) (f y) of
-- etc. (I will let you fill in the details.)
编写的一个快捷方式是使用Data.Ord
进行comparing
,它允许您将compare (fx) (fy)
替换为comparing fxy
。 进一步的快捷方式,上面所建议的通过user2407038,使用maximumBy
从Data.List
给它的所有降低到单行maximumBy (comparing f) [x,y]
直截了当的实施怎么样:
maximize f x y = if (f x) > (f y) then x else y
另一种选择是
maximize f x y = argmax f [x,y]
但这需要安装list-extras包 。
但是,我认为其他答案更为惯用(@duplode)和更简单(@Uri Goren)。
使用警卫的另一种非常简单的方法:
maxiM :: (Ord b) => (a -> b) -> a -> a -> a
maxiM func v1 v2
| (func v1) < (func v2) = (func v2)
| otherwise = (func v1)
我建议看看learnyouahaskell。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.