我正在尝试将使用 foldr 函数的最大函数转换为也包含可能类型的函数。原来是:
maximum' :: (Ord a) => [a] -> a
maximum' = foldr1 (\x acc -> if x > acc then x else acc)
它适用于集合,但不适用于空集合。我想将其转换为使用可能的类型。
我的思考过程是:
mymax :: (Ord a) => [Maybe a] -> Maybe a
mymax = foldr (\(Just x) (Just b) -> if ((Just x) > (Just b)) then (Just x) else (Just b)) Nothing
当我给它一个空集时,它编译没有错误并且可以工作。但是,当我给它一个带有数字的集合时,它不再起作用了!有人可以指出我如何获得它的功能并从可能的列表中获得最大的正确方向吗?
我真的很想在我的解决方案中使用 foldr 函数......
我现在尝试过:
mymax :: (Ord a) => [a] -> Maybe a
mymax = foldr (\x b -> if x > b then (Just x) else (Just b)) Nothing
但它不会编译:
Couldn't match expected type `Maybe b -> Maybe a'
with actual type `Maybe a0'
In the return type of a call of `Just'
Probable cause: `Just' is applied to too many arguments
In the expression: (Just x)
In the expression: if x > b then (Just x) else (Just b)
Failed, modules loaded: none.