繁体   English   中英

根据功能最大化

[英]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)返回fxfy ,而不是xy 你必须比较前一对值然后返回后者之一。 一种方法是在结果上使用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,使用maximumByData.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM