我有一个要过滤的字符串列表。我的断言是字符串应该以大写字母开头。
例如当我运行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
但是它甚至没有编译。基本上,我只是想弄清楚如何在列表列表中使用过滤器功能。预先感谢您提供的任何帮助。
答案 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.List
和Data.Char
:
import Data.List
import Data.Char
onlyLowerCase :: [String] -> [String]
onlyLowerCase = filter (all isLower)
我使用all
函数,该函数检查列表中的all
个元素是否满足谓词。在这种情况下,如果all isLower
中的所有字母均为小写,则String
将返回true。然后filter
Strings
都是小写。 Haskell Report在其他有用的库中对List
和Char
函数有很好的参考。