我需要编写一个代码,如果函数满足list的大部分元素并且false不满足,则会给出True。
例如:moreThan odd [1,2,3]
为True
,但moreThan odd [1,2,3,4]
为False
。
这是我的代码:
moreThan funkt xs
= let
control funkt n (x : xs)
= control (if .?. then n + 1 else n) xs
contol funkt _
= False
in
control funtk 0 xs
有人可以说我如何控制这一点以及我应该在.?.
写些什么
谢谢!
答案 0 :(得分:3)
您编写的函数将为所有参数返回False
,因为您在列表结束时总是返回False
。
您编写的函数需要跟踪两个变量:处理的元素数和谓词为true的元素数。由于这段代码可能是作业,我给你一个可以用来编写函数的构造。在-- ???
位置填写您自己的代码。
moreThan :: (a -> Bool) -> [a] -> Bool
moreThan pred = go 0 0 where
-- procd: number of elements processed
-- holds: number of elements for which pred holds
go procd holds (x:xs) = go procd' holds' xs where
procd' = -- ???
holds' = -- ???
go procd holds [] = -- ???
如果您需要更多提示,请随时发表评论。
编写此函数的更惯用的方法是使用fold:
moreThan pred = finalize . foldr go (0,0) where
-- process one element of the input, produce another tuple
go (procd,holds) x = -- ???
-- produce a boolean value from the result-tuple
finalize (procd,holds) = -- ???
答案 1 :(得分:2)
了解您的图书馆!
import Data.List(partition)
import Data.Function(on)
moreThan f = (uncurry $ on (>) length) . partition f
如果您不允许使用分区,请自行编写:
part f xs = (filter f xs, filter (not.f) xs)
或者采用数字方式:
moreThan f xs = 2*s > length xs where s = sum $ map (fromEnum.f) xs
答案 2 :(得分:1)
也许不是最有效的解决方案,但肯定是非常明确的解决方案,如下:
moreThan :: (a -> Bool) -> [a] -> Bool
moreThan f xs = length ts > length fs where
ts = filter id bools
fs = filter not bools
bools = map f xs
答案 3 :(得分:1)
majority :: (a -> Bool) -> [a] -> Bool
majority p = (0 <) . sum . map (\x -> if pred x then 1 else -1)
这是在列表元素上的映射(如果是pred x然后是1,则为其他-1),然后对列表元素求和并查看结果是否为&gt; 0
答案 4 :(得分:0)
我希望这是有效的(只遍历列表一次)但仍然相当清楚。
majority :: (a -> Bool) -> [a] -> Bool
majority pred = g . sum . map f
where f x | pred x = 1
| otherwise = -1
g y = 0 < y