Если я правильно понимаю ваш вопрос, вы хотите получить все элементы в 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