Как проверить наличие пустых пересечений списков с помощью Haskell - PullRequest
0 голосов
/ 08 марта 2019

Ниже приведена моя попытка кода для создания, а затем проверки пересечения двух списков в Haskell.Может ли кто-нибудь помочь мне запустить его?

empty_intersection :: (Eq a_ => [a] -> [a] -> Bool
empty_intersection as bs = (true if ([x | x <- as, x  `elem` bs) else false)

Ответы [ 3 ]

4 голосов
/ 08 марта 2019

Задача

Ваш код не будет компилироваться, потому что список не может быть логическим, поэтому вы не можете иметь его в операторе if. Однако есть такие функции, как all, any и null, которые могут принимать списки и возвращать логические значения.

Решение

Просто используйте функцию Prelude null :: [a] -> Bool, которая возвращает true, если ваш список пуст. (Также обратите внимание, что @Bergi сказал, что в ограничении типов есть опечатка)

empty_intersection :: (Eq a => [a] -> [a] -> Bool
empty_intersection as bs = null [x | x <- as, x  `elem` bs]

Еще лучше

Кроме того, поскольку это ваш второй вопрос об объединениях множеств и пересечениях, обратите внимание, что есть библиотека Data.Set для работы с упорядоченными множествами, которая имеет гораздо более эффективные функции для пересечения, объединения, членства, разности и т. Д.

4 голосов
/ 08 марта 2019

У вас здесь, в принципе, правильная идея, есть только несколько небольших проблем:

  • Вы не закрыли скобки вокруг понимания списка, что приводит к ошибке разбора.
  • Список нельзя использовать напрямую с if, поскольку if работает только со значениями типа Bool. Возможно, вы думаете о некоторых других языках, где списки / массивы считаются «истинными» тогда и только тогда, когда они непустые - но Haskell не выполняет автоматических преобразований типов, поэтому вам нужно явно проверить, не является ли список непустым. Лучший и самый простой способ сделать это - использовать функцию null (которая принимает список и возвращает True, если он пуст, и False в противном случае).
  • Как указал @Bergi (а я пропустил изначально), в вашем ограничении (Eq a) есть опечатка.
  • Оператор if обратный. Python имеет конструкцию x if (condition) else y, но вместо этого Haskell использует if condition then x else y. Кроме того, хотя это не так, в этом нет необходимости, когда ваши x и y равны True и False, потому что все это просто оценивает то, чем является (condition).

Итак, код должен быть:

empty_intersection :: (Eq a) => [a] -> [a] -> Bool
empty_intersection as bs = null [x | x <- as, x  `elem` bs]
0 голосов
/ 08 марта 2019

Вы можете использовать intersect

empty_intersection :: (Eq a) => [a] -> [a] -> Bool
empty_intersection = null . intersect
...