You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell实现ownMax函数调用maximumBy报类型匹配错误如何解决

问题原因

你代码的问题出在两处:

  1. 类型签名约束错误:你标注的约束是Ord c,但你实际需要对函数f的返回值b做比较,没有用到的类型参数c是冗余的,约束应该改为Ord b。
  2. maximumBy的传参逻辑错误:maximumBy的类型是Foldable t => (a -> a -> Ordering) -> t a -> a,需要分别传入两个参数:第一个是两个元素的比较函数,第二个是待处理的列表。你当前的写法是把列表(x:xs)直接传给了比较lambda,相当于先给lambda喂了一个参数,得到的是a -> Ordering类型的单参数函数,和maximumBy要求的第一个参数类型不符,所以报了类型匹配错误。

修复方案

调整传参逻辑即可,也可以用Data.Ord下的comparing函数简化比较逻辑,两种实现都可以:

写法1:直接用你写的比较lambda

import Data.List (maximumBy)

ownMax :: Ord b => (a -> b) -> [a] -> a
ownMax f xs = maximumBy (\a b -> compare (f a) (f b)) xs

写法2:用comparing简化代码

import Data.List (maximumBy)
import Data.Ord (comparing)

ownMax :: Ord b => (a -> b) -> [a] -> a
ownMax f = maximumBy (comparing f)

验证示例

修复后的代码可以直接通过你给出的测试用例:

  • ownMax (\x -> x mod 5) [7,8,9] == 9 执行结果为True
  • ownMax length ["words", "are", "hard"] == "words" 执行结果为True

内容的提问来源于stack exchange,提问作者BeanieBarrow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:54:00