Давайте внимательно посмотрим на фрагмент вашего кода:
subset (x:xs) ys
| elem x ys = subset (x:xs) ys
В случае выполнения elem x ys
, что вполне вероятно, у вас есть
subset (x:xs) ys = subset (x:xs) ys
, который не приводит к уменьшениюлюбой из его аргументов и просто повторяет один и тот же вызов заново.
Следовательно, бесконечный цикл.
При работе с булевыми значениями принято использовать логические связки, что часто приводит к более лаконичными четкие определения:
subset (x:xs) ys = elem x ys && subset ..... .....
- это все, что вам нужно, потому что таблица истинности (&&)
равна
True && x = x
False && _ = False
, т.е. когда первый аргумент равен false, значение второго аргумента равнодаже не осмотрен.