【问题标题】:How to find maximum of function outputs with multipe inputs in one function?如何在一个函数中找到具有多个输入的最大函数输出?
【发布时间】:2021-07-06 15:33:22
【问题描述】:

我想要一个函数 maxfunct,输入 f(一个函数)和输入 n(int),它计算函数 f 的所有输出,输入为 0 到 n,并检查输出的最大值。

我对 haskell 很陌生,我尝试过的是这样的:

maxfunct f n
  | n < 0 = 0
  | otherwise = maximum [k | k <- [\(f, x)-> f x], x<- [0..n]]

我的想法是我将 f 的每个输出存储在一个列表中,并检查该列表中的最大值。 我怎样才能做到这一点?

【问题讨论】:

  • 您认为k &lt;- [\(f, x)-&gt; f x] 是什么意思?

标签: function haskell


【解决方案1】:

你已经接近了。首先,让我们注意我们正在尝试编写的函数的类型。从类型入手,除了可以帮助你更好地感受函数,还可以让编译器给我们更好的错误信息。看起来你期待一个函数和一个整数。函数的结果应该与maximum 兼容(即应该满足Ord)并且还需要有一个合理的“零”值(所以为了简单起见,我们只说它需要Num;实际上,我们可能会考虑使用BoundedMonoid 或其他东西,这取决于您的需要,但现在Num 就足够了。

这就是我建议的类型签名。

maxfunct :: (Num a, Ord a) => (Int -> a) -> Int -> a

从技术上讲,我们可以进行更多概括,并将Int 也设为类型参数(需要NumEnumOrd),但这可能有点矫枉过正。现在,让我们看看您的实现。

maxfunct f n
  | n < 0 = 0
  | otherwise = maximum [k | k <- [\(f, x)-> f x], x<- [0..n]]

还不错。第一种情况肯定是好的。但我认为您可能对列表理解语法有些困惑。我们想要说的是:从0n 的每个值,应用f,然后最大化。

maxfunct :: (Num a, Ord a) => (Int -> a) -> Int -> a
maxfunct f n
  | n < 0 = 0
  | otherwise = maximum [f x | x <- [0..n]]

你有它。对于它的价值,你也可以很容易地使用map 做到这一点。

maxfunct :: (Num a, Ord a) => (Int -> a) -> Int -> a
maxfunct f n
  | n < 0 = 0
  | otherwise = maximum $ map f [0..n]

这只是您觉得更容易阅读的问题。我本人是 map / filter 的人,但很多人更喜欢列表推导,所以每个人都有自己的。

【讨论】:

  • 非常感谢。干杯
猜你喜欢
  • 2020-08-25
  • 2022-01-10
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多