【发布时间】:2019-05-02 16:37:34
【问题描述】:
我正在尝试使用过滤器(尽管我也可以使用 map 和/或 foldr)来查找列表的最大元素。
我尝试过滤掉每个小于 max 的数字,但它拒绝接受 max 作为过滤器参数。
这是我的代码:
max' :: Ord a => [a] -> a
max' xs = filter (< max) xs
这是我得到的错误:
* Couldn't match type `a' with `a0 -> a0 -> a0'
`a' is a rigid type variable bound by
the type signature for:
max' :: forall a. Ord a => [a] -> a
at Prog8.hs:50:1-25
Expected type: [a0 -> a0 -> a0]
Actual type: [a]
* In the second argument of `filter', namely `xs'
In the expression: filter (< max) xs
In an equation for max': max' xs = filter (< max) xs
* Relevant bindings include
xs :: [a] (bound at Prog8.hs:51:6)
max' :: [a] -> a (bound at Prog8.hs:51:1)
有没有办法在一个简单的过滤函数中写入 max'(或者可以将它与 map 或 foldr 结合使用)?
【问题讨论】:
-
将
max实现为折叠很容易。 (我认为列表上的任何递归函数都可以作为折叠来完成。)但你绝对不能只使用map和/或filter。 (好吧,我不明白怎么做,但有人可能会证明我错了:)) -
我可以用 foldr 做吗?我正在尝试使用 foldr、map 和 filter。
-
是的,你当然可以。您的累加器只是“迄今为止”的最大值。您可能想要
foldr1而不是foldr(它在空列表上崩溃,但max也是如此)。 -
刚刚实现了求列表最大值的函数其实是
maximum(max取2个普通值,返回较大的值) -
使用您拥有的类型签名,
max' []可以返回的唯一明智的事情是⊥。如果您可以重组您的调用代码,使其可以使用Ord a => NonEmpty a -> a或Ord a => [a] -> Maybe a,则可以避免使用⊥。
标签: haskell