你已经接近了。首先,让我们注意我们正在尝试编写的函数的类型。从类型入手,除了可以帮助你更好地感受函数,还可以让编译器给我们更好的错误信息。看起来你期待一个函数和一个整数。函数的结果应该与maximum 兼容(即应该满足Ord)并且还需要有一个合理的“零”值(所以为了简单起见,我们只说它需要Num;实际上,我们可能会考虑使用Bounded 或Monoid 或其他东西,这取决于您的需要,但现在Num 就足够了。
这就是我建议的类型签名。
maxfunct :: (Num a, Ord a) => (Int -> a) -> Int -> a
从技术上讲,我们可以进行更多概括,并将Int 也设为类型参数(需要Num、Enum 和Ord),但这可能有点矫枉过正。现在,让我们看看您的实现。
maxfunct f n
| n < 0 = 0
| otherwise = maximum [k | k <- [\(f, x)-> f x], x<- [0..n]]
还不错。第一种情况肯定是好的。但我认为您可能对列表理解语法有些困惑。我们想要说的是:从0 到n 的每个值,应用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 的人,但很多人更喜欢列表推导,所以每个人都有自己的。