Haskell实现ownMax函数调用maximumBy报类型匹配错误如何解决
问题原因
你代码的问题出在两处:
- 类型签名约束错误:你标注的约束是
Ord c,但你实际需要对函数f的返回值b做比较,没有用到的类型参数c是冗余的,约束应该改为Ord b。 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 -> xmod5) [7,8,9] == 9执行结果为TrueownMax length ["words", "are", "hard"] == "words"执行结果为True
内容的提问来源于stack exchange,提问作者BeanieBarrow
相关产品推荐
相关产品推荐

