Задать вопрос
@Nikitos_STR

Как определить является список подсписком?

Здравствуйте, есть задание: Имеется два списка. Определить является ли первый список подсписком второго.

Я написал код, он вроде должен работать, но нет. Может кто-нибудь подсказать, что я сделал не так?

Спасибо.

sublist v w = 
	if w == [] 
		then False
		else if v == h_w 
			then True
			else if h_w /= [] 
				then sublist v h_w
				else sublist v t_w
	where 
		h_w = head w
		t_w = tail w
  • Вопрос задан
  • 328 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
  1. Используйте сопоставление с образцом в определении функции вместо портянки if/else
  2. v == h_w тут вообще не должно компилироваться, т.к. v по определению это список, а h_w это элемент списка (head).
  3. Пропущен случай, когда список v пустой. При соблюдении первого правила такие ошибки легче находятся

А теперь по алгоритму. Он у вас более императивный, чем функциональный.
Если вам не нужно строить структуру данных (например заполнять дерево) по ходу выполнения алгоритма, то зачастую от рекурсии можно отказаться.
isSublist :: Eq a => [a] -> [a] -> Bool
isSublist a b = all (`elem` b) a

Если elem использовать нельзя, то можно эту функцию самому определить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы