繁体   English   中英

Haskell:过滤字符串列表

[英]Haskell : Filtering a list of strings

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

例如。 当我只运行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"]

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

我也尝试使用

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

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

感谢Willem Van Onsem建议使用lambda表达式作为过滤器函数,我进一步阅读并提出了这2行解决方案。

onlyLowercase2 :: [String] -> [String]
onlyLowercase2 = filter (\st-> ("" /= st) && (isLower $ head st))

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

使用Data.ListData.Char

import Data.List
import Data.Char

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM