满足haskell中大多数元素的函数

时间:2012-05-21 21:10:33

标签: list function haskell

我需要编写一个代码,如果函数满足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

有人可以说我如何控制这一点以及我应该在.?.写些什么 谢谢!

5 个答案:

答案 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