У меня есть список строк, которые я хочу отфильтровать.Мой предикат состоит в том, что строка должна начинаться с заглавной буквы.
например.когда я запускаю onlyLowercase ["boy", "girl", "Hi"]
, это должно дать мне список ["boy", "girl"]
Я могу сделать это, используя сопоставление с образцом и охранников, но я использую Learnyouahaskell (http://learnyouahaskell.com) книга и я наткнулся на тему о функциях высшего порядка. Я прочитал о функции фильтра и подумал, что она может достичь того, что я хочу сделать, с гораздо меньшим количеством строк кода.
Использование сопоставления с образцом/ Guards (это хорошо работает и решает мою проблему)
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
, но это даже не компилировалось. По сути, я просто пытаюсь выяснить, как фильтрФункция может быть использована в списке списков. Спасибо, в Advaнс, за любую оказанную помощь.