Haskell: фильтрация списка строк - PullRequest
0 голосов
/ 07 октября 2018

У меня есть список строк, которые я хочу отфильтровать.Мой предикат состоит в том, что строка должна начинаться с заглавной буквы.

например.когда я запускаю 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нс, за любую оказанную помощь.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Использование Data.List и Data.Char:

import Data.List
import Data.Char

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

Я использую функцию all, которая проверяет, что all элементы списка удовлетворяют предикату.В этом случае all isLower вернет true, если все буквы в String строчные.Тогда просто filter Strings, которые все строчные. Отчет по Haskell содержит хорошую справку для функций List и Char среди других полезных библиотек.

0 голосов
/ 07 октября 2018

Благодаря предложению Виллема Ван Онсема использовать лямбда-выражение в качестве функции фильтра, я прочитал далее и придумал это двухстрочное решение.

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

Не уверен, что оно идеально, но по крайней мере эторабочий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...