Как отфильтровать список списков, используя список в haskell - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть этот список списков

a = [["a","b","c"],["d","e","f"]]
b = ["a","b"]

Я хочу отфильтровать, используя b

, поэтому на выходе должно быть ["a","b","c"]

все элементы в b должны быть в

1 Ответ

1 голос
/ 26 февраля 2020

Если я правильно понимаю ваш вопрос, вы хотите получить все элементы в a, которые содержат все элементы в b. Если вы хотите, чтобы элементы в b были абсолютно смежными в a, это будет уловкой:

import Data.List
f :: Eq a => [a] -> [[a]] -> [[a]]
f b a = filter (b `isSubsequenceOf`) a

Если под "соответствием инфикса" вы подразумевали, что ваше условие фильтрации было для b будет инфиксом элемента в a (а не префиксом или суффиксом), тогда вы можете использовать isInfixOf, из Data.List вместо isSubsequenceOf в приведенном выше примере.

Если вы хотите разрешить совпадения, в которых элементы не являются смежными (это неясно в вашем вопросе), то вы можете сделать это:

f :: Eq a => [a] -> [[a]] -> [[a]]
f b a = filter (\el -> el `intersect` b == b) a
--or, in pointfree form
f b a = filter ((b ==) . (`intersect` b)) a

Кредит, причитающийся кредит для этого последнего фрагмента кода.

Обратите внимание, что эти функции будут возвращать все возможные совпадения ([[a]]); если вместо этого вы хотите только первое совпадение, просто сопоставьте шаблон, чтобы извлечь первый элемент или headMay из пакета safe:

fOnly1 b a = case f b a of
  (x:_) -> Just x
  _     -> Nothing

fOnly1' b a = headMay $ f b a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...