Если возникают проблемы с пониманием того, почему код ниже не останавливается, когда я запускаю его на repl.it.
-- The second argument is meant to be an infinite ascending list, don't bother yourself with any other case
isin :: Int -> [Int] -> (Bool, [Int])
isin n [] = (False, []) -- This case is unnecessary because the list is infinite, but just for completion
isin n l@(x:xs) =
case n `compare` x of
LT -> (False, l)
EQ -> (True, xs)
GT -> isin n xs
>>> isin 2 [1..]
-- prints nothing --Edit
-- expected (True, [3,4,5... --Edit
На мой взгляд, выполнение этого должно выглядеть примерно так:
-- underscore is meant to be "unevaluated". (Probably not 100% accurate but you can follow my idea)
isin 2 1:_ -- first call
2 `compare` 1 -- GT
isin 2 _
isin 2 2:_ -- second call
2 `compare` 2 -- EQ
(True, _)
(True, 3:_) -- returned result
AFAIK, это должно работать правильно, если только кортежи не строгие, в этом случае я буду использовать другая структура ... но я на 90% уверен, что они не
Если вам интересно, идея заключается в том, что isin
будет вызываться несколько раз с увеличивающимися номерами в одном и том же списке, поэтому я могу опускать головы при проверке.