Рассмотрим вырываясь из в противном случае не оконечное раз:перевод Схема вызова/куб.см, чтобы Haskell callCC
(call/cc (lambda (folded)
(stream-fold
(lambda (acc v)
(if (< v 5)
(cons v acc)
(folded acc)))
'()
(in-naturals 0))))
; returns '(4 3 2 1 0)
Haskell эквивалент кода выше будет
callCC $ \folded -> foldl (\acc v -> if v < 5 then v:acc else folded acc) [] [0..]
Этот код делает не компилируются и жалуются на невозможность построить бесконечный тип в сложенном выражении acc. У меня уже есть идея, как устранить эту ошибку в таких случаях, как комбинатор Y, но такой же подход, похоже, не работает здесь. Каков правильный подход к подобной ситуации?
Используйте 'foldM' вместо' foldl'. Здесь у вас есть, что 'v: acc' и' folded acc' не возвращают один и тот же тип. –