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)
is7*_*s7s 12
我认为你不能比你建议的更具可读性.但是,只是为了它的乐趣,你可以这样做:
numberOfElements = (.) (.) (.) length filter
Run Code Online (Sandbox Code Playgroud)
要么
(.:) = (.) . (.)
numberOfElements = length .: filter
Run Code Online (Sandbox Code Playgroud)
您可能希望阅读有关语义编辑器组合器的信息.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)
| 归档时间: |
|
| 查看次数: |
1244 次 |
| 最近记录: |