Haskell. Вернуть список чисел, в котором присутствует хотя бы одна из тех же цифр, что и в "n" - PullRequest
0 голосов
/ 28 мая 2020

Дан список чисел «lst» и номер «n». Возвращает список чисел, в котором присутствует хотя бы одна из тех же цифр, что и в «n». Система счисления считается десятичной.

Функция должна возвращать следующие результаты:

sameDigits [1,11,45,23] 12 -> [1,11,23]
sameDigits [72,47,55] 7 -> [72, 47]

Я решаю задачу, используя «понимание списка». Я перебираю числа из списка, конвертирую их в «строку элементов» и получаю для каждого элемента «список различных наборов» этих элементов и сравниваю их со списком различных наборов, полученных из данного числа. Если длина списка > 0, я включаю этот элемент в список результатов. Решаю задачу с помощью функции «subsequences», которая возвращает все возможные итерации каждого элемента списка; и функция «пересекается», которая возвращает список общих элементов для двух списков:

 let sameDigits lst n = [ x | x <- lst, if length (tail 
        (subsequences (show x)
          `intersect` subsequences (show n))) > 0 
     then x else [] ]

Но функция вылетает с ошибкой, помогите мне исправить.

<interactive>:63:131: 
Couldn't match expected type ‘Bool’ 
         with actual type ‘[t0]’ 
In the expression: [] 
In the expression: 
    if length (tail (subsequences (show x) 
         `intersect` subsequences (show n))) > 0 
      then x else [] 
 In a stmt of a list comprehension: 
    if length (tail (subsequences (show x) 
         `intersect` subsequences (show n))) > 0 
      then x else [] 

1 Ответ

0 голосов
/ 28 мая 2020

Спасибо, Робин Зигмонд! Вот функция, созданная по его рекомендации.

let sameDigits lst n = [ x | x <- lst, length (tail (subsequences (show x) `intersect` subsequences (show n))) > 0 ]

sameDigits [1,11,45,23] 12
-> [1,11,23]
sameDigits [72,47,55] 7
-> [72,47]
...