Haskell中无点样式的元素数量

Luk*_*iwa 10 haskell filter pointfree

我想定义一个函数来计算列表中满足给定谓词的元素数量:

  number_of_elements :: (a -> Bool) -> [a] -> Int
  number_of_elements f xs = length (filter f xs)
Run Code Online (Sandbox Code Playgroud)

例如:

  number_of_elements (==2) [2,1,54,1,2]
Run Code Online (Sandbox Code Playgroud)

应该返回2.

我们可以写得更短:

  number_of_elements f = length . filter f
Run Code Online (Sandbox Code Playgroud)

是否可以在没有f参数的情况下编写它?

Rot*_*sor 17

当然是啦:

number_of_elements = (length .) . filter
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是正确的无点,不可读的风格:) (17认同)

is7*_*s7s 12

我认为你不能比你建议的更具可读性.但是,只是为了它的乐趣,你可以这样做:

numberOfElements = (.) (.) (.) length filter
Run Code Online (Sandbox Code Playgroud)

要么

(.:) = (.) . (.)
numberOfElements = length .: filter
Run Code Online (Sandbox Code Playgroud)

  • `(.*)`通常称为`(.:)`; [lambdabot](http://www.haskell.org/haskellwiki/Lambdabot)称之为. (3认同)
  • 为什么不``fmap fmap fmap`? (2认同)

Dan*_*ner 7

您可能希望阅读有关语义编辑器组合器的信息.result从那里拿组合器:

result :: (output -> output') -> (input -> output) -> (input -> output')
result = (.)
Run Code Online (Sandbox Code Playgroud)

result组合子接受一个函数,并将其应用于另一个函数的结果.现在,看看我们的功能:

filter :: (a -> Bool) -> [a] -> [a]
length :: [a] -> Int
Run Code Online (Sandbox Code Playgroud)

现在,length适用于[a]; 它发生的是表单函数的结果类型foo :: [a] -> [a].所以,

result length :: ([a] -> [a]) -> ([a] -> Int)
Run Code Online (Sandbox Code Playgroud)

但结果filter恰好是一个[a] -> [a]函数,所以我们想要应用于result length以下结果filter:

number_of_elements = result (result length) filter
Run Code Online (Sandbox Code Playgroud)