Haskell : Filtering a list of strings
我有一个要过滤的字符串列表。我的谓词是字符串应该以大写字母开头。
例如。当我运行 onlyLowercase ["boy","girl","Hi"]
它应该给我一个 ["boy","girl"]
的列表
我可以使用模式匹配和守卫来做到这一点,但我使用的是 learnyouahaskell (http://learnyouahaskell.com) 书,我遇到了关于高阶函数的主题。我阅读了有关过滤器功能的信息,并认为它可以用更少的代码行来实现我想要做的事情。
使用模式匹配/守卫(这很好,解决了我的问题)
1 2 3 4 5
| onlyLowercase :: [[Char]] -> [[Char]]
onlyLowercase [] = []
onlyLowercase (x :xs )
| isLower (head x ) = x : onlyLowercase xs
| otherwise = onlyLowercase xs |
使用过滤功能
1 2 3
| onlyLowercase2 :: [String] -> [String]
onlyLowercase2 [] = []
onlyLowercase2 (x :xs ) = filter isLower x : onlyLowercase2 xs |
不幸的是,当我运行 onlyLowercase2 ["boy","girl","Hi"] 时,
我得到 ["boy","girl","i"].
的列表
我想知道是否有一种方法可以使用字符串中的第一个字符过滤字符串列表(无需创建任何可以检查字符串并在第一个字母为小写时返回 true 的辅助函数)。
我也尝试过使用
1
| onlyLowercase2 (x :xs ) = filter (isLower head x ) : onlyLowercase2 xs |
但这甚至没有编译。基本上,我只是想弄清楚如何在列表列表中使用过滤器功能。提前感谢您提供的任何帮助。
- 是的,但您不应该过滤元素 x,您过滤列表,并在过滤器中占据头部。
-
然而,这里有一个会出错的情况:一个空字符串的列表。
-
所以我不应该取 (x:xs),而应该只取 xs 作为参数?
-
你明白你的 onlyLowercase2 是做什么的吗?怎么运行的?在出现有意义的功能之前,请不要只是"跟踪和错误"。
-
我想我这样做了,它接受一个 list ,然后检查 head (x) 是否是Lower,如果它是真的,它将它添加到结果列表中。我知道这就是为什么在我的示例中涉及字符串"Hi"时,过滤器会检查整个字符串并将小写字母添加到返回列表中。然而,我想做的是只检查字符串的第一个字符。我不知道这样做的语法。
-
不。过滤器应返回 True 或 False,如果返回 True,则将相应的值添加到结果列表中,如果返回 False,则不添加。
-
我理解那部分。我希望过滤器只检查第一个字符而不是整个字符串
-
那么在过滤器函数中,你取那个字符串的第一个字符。您无需先对应过滤的元素进行预处理。
-
这就是我试图通过这样做(isLower head x)来做的,只检查字符串中的第一个字符,但这种语法不起作用。所以我只是想知道哪种语法
-
但是你不应该使用外部列表的 x 。定义一个 lambda 表达式作为过滤函数,所以 filter (\\x -> ...)。
-
我还没有进入书中关于 Lamba 表达式的主题,所以让我学习如何使用它们然后再试一次。 :)
-
lamdas 工作得很好。非常感谢你。这是我的最终解决方案。 onlyLowercase2 = filter (\\x -> ("" /= x) && (isLower $ head x))
-
你也可以使用像 filter ((&&) <$> isLower . head <*> (/="")) 这样没有 lambda 的应用风格。
-
这对我来说太先进了哈哈。 (学习haskell只有几个星期),但我会阅读这个,这样我就可以完全理解你写的一切。太感谢了。
-
learnyouahaskell.com/… 中对此进行了完美解释。仅供参考。
感谢 Willem Van Onsem 建议使用 lambda 表达式作为过滤函数,我进一步阅读并提出了这个 2 行解决方案。
不确定它是否完美,但至少它可以工作。
使用 Data.List 和 Data.Char:
我使用 all 函数来检查列表的 all 元素是否满足谓词。在这种情况下,如果 String 中的所有字母都是小写,则 all isLower 将返回 true。然后只是 filter 和 Strings 都是小写的。 Haskell 报告对 List 和 Char 函数以及其他有用的库有很好的参考。