Это вопрос о нобе.Haskell: Скрытие сбоев в ленивом IO
Я хотел бы написать функцию, которая обеспечивает ленивый поток изображений, по-видимому что-то вроде:
imageStream :: [IO Image]
К сожалению, функция, которая считывает изображения может не сработать, так как это выглядит:
readImage :: IO (Maybe Image)
Таким образом, функция I может запись выглядит следующим образом:
maybeImageStream :: [IO (Maybe Image)]
Как реализовать функцию, такую как следующее, сохраняя при этом ленивый ввод-вывод?
flattenImageStream :: [IO (Maybe Image)] -> [IO Image]
семантический, когда вы спросите flattenImageStream
для следующего изображения, он должен перебирать список и пытаться читать каждое изображение. Он делает это, пока не найдет изображение, которое загружает и возвращает его.
EDIT: В ответах есть некоторые разногласия. Некоторые предложили решения, которые используют sequence
, но я уверен, что проверял это и обнаружил, что он уничтожает лень. (я проверю его снова, чтобы убедиться, когда вернусь к компьютеру.) Кто-то также предложил использовать unsafeInterleaveIO
. Из документации для этой функции, похоже, это сработает, но, очевидно, я хочу как можно больше уважать систему типов.
Вы действительно хотите '[IO Image]'? С 'IO [Image]' было бы легче работать? – jwodder
@jwodder, я могу ошибаться, но я думаю, что 'IO [Image]' подразумевает, что изображения будут загружаться строго, в то время как я хочу загрузить их лениво из-за памяти и других вещей. – emchristiansen
Нет, они все равно будут лениться. если вы вернете [IO Image], вы ничего не загрузили. У вас есть только список функций io для загрузки изображений. – DiegoNolan