Обратите внимание, что предикат
[x] `intersect` xs == [x]
всегда true , так как cycle
повторяет список бесконечное время как
[1, -2, 3, 2, 3, 4, 5, 5, 1, -2, 3, 2, 3, 4, 5, 5, ...]
и 1
должныбыть элементом [-2, 3, 2, 3, 4, 5, 5, 1, -2, 3, 2, 3, 4, 5, 5, ...]
, поэтому
[1] `intersect` [-2, 3, 2, 3, 4, 5, 5, 1, -2, 3, 2, 3, 4, 5, 5, ...] = [1]
, поэтому V1
firstDup
return Just 1
.
In V2
, firstDup'
рекурсивно конструирует Набор как:
{}
{1}
{1, -2}
{1, -2, 3}
{1, -2, 3, 2, ...}
и проверяет следующий вставленный элемент, является ли элемент набора как:
1 `Set.member` {}
-2 `Set.member` {1}
3 `Set.member` {1, -2}
2 `Set.member` {1, -2, 3}
3 `Set.member` {1, -2, 3, 2}
Обратите внимание, что 3
является членом {1, -2, 3, 2}
, поэтому firstDup'
возврат Just 3
.