Haskell:过滤字符串列表

时间:2018-10-07 18:34:04

标签: haskell filter

我有一个要过滤的字符串列表。我的断言是字符串应该以大写字母开头。

例如当我运行onlyLowercase ["boy", "girl", "Hi"]

它应该给我一个["boy", "girl"]

的列表

我可以使用模式匹配和防护来做到这一点,但是我使用的是Learnyouahaskell(http://learnyouahaskell.com)书,因此我遇到了有关高阶函数的主题。我阅读了有关过滤器功能的文章,并认为它可以用更少的代码行实现我想做的事情。

使用模式匹配/防护(效果很好,可以解决我的问题)

onlyLowercase :: [[Char]] -> [[Char]]
onlyLowercase [] = []
onlyLowercase (x:xs) 
  | isLower (head x) = x : onlyLowercase xs  
  | otherwise = onlyLowercase xs

使用过滤器功能

onlyLowercase2 :: [String] -> [String]
onlyLowercase2 [] = []
onlyLowercase2 (x:xs) = filter isLower x : onlyLowercase2 xs

不幸的是,当我运行onlyLowercase2 ["boy", "girl", "Hi"]时, 我得到了["boy", "girl", "i"]的列表。

我想知道是否有一种方法可以使用字符串中的第一个字符过滤字符串列表(无需创建任何可以检查字符串并在第一个字母为小写的情况下返回true的辅助函数)。

我也尝试使用

 onlyLowercase2 (x:xs) = filter (isLower head x) : onlyLowercase2 xs

但是它甚至没有编译。基本上,我只是想弄清楚如何在列表列表中使用过滤器功能。预先感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:6)

由于威廉·范·昂塞姆(Willem Van Onsem)建议使用lambda表达式作为过滤函数,我进一步阅读并提出了这2行解决方案。

import networkx as nx
G = nx.DiGraph() 

for n in G.nodes():
     v.append(1/ G.out_degree(n))

不确定它是否完美,但至少可以正常工作。

答案 1 :(得分:1)

使用Data.ListData.Char

import Data.List
import Data.Char

onlyLowerCase :: [String] -> [String]
onlyLowerCase = filter (all isLower)

我使用all函数,该函数检查列表中的all个元素是否满足谓词。在这种情况下,如果all isLower中的所有字母均为小写,则String将返回true。然后filter Strings都是小写。 Haskell Report在其他有用的库中对ListChar函数有很好的参考。