我有一个我想要过滤的字符串列表.我的谓词是字符串应该以大写字母开头.
例如.我跑的时候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
Run Code Online (Sandbox Code Playgroud)
使用过滤功能
onlyLowercase2 :: [String] -> [String]
onlyLowercase2 [] = []
onlyLowercase2 (x:xs) = filter isLower x : onlyLowercase2 xs
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我跑步时onlyLowercase2 ["boy", "girl", "Hi"],我得到了一份清单["boy", "girl", "i"].
我想知道是否有一种方法可以使用我的字符串中的第一个字符来过滤我的字符串列表(不创建任何可以检查字符串的辅助函数,如果第一个字母是小写则返回true).
我也试过用
onlyLowercase2 (x:xs) = filter (isLower head x) : onlyLowercase2 xs
Run Code Online (Sandbox Code Playgroud)
但那甚至没有编译.基本上,我只想弄清楚如何在列表列表中使用过滤器功能.提前感谢您提供的任何帮助.
感谢Willem Van Onsem建议使用lambda表达式作为过滤函数,我进一步阅读并提出了这个2行解决方案.
onlyLowercase2 :: [String] -> [String]
onlyLowercase2 = filter (\st-> ("" /= st) && (isLower $ head st))
Run Code Online (Sandbox Code Playgroud)
不确定它是否完美,但至少它是有效的.