Как строго свернуть монаду? Данные.Складная
имеет строгую складку
и монадическую складку
, но не имеет строгой складки
? Строгость как-то определяется самой монадой? Если да, то как понять, что это такое?
Представьте, что я должен определить, является ли произведение огромного списка элементов кольца нулем, но мое кольцо не является областью целостности, т.е. оно не содержит девизоров. В этом случае я должен рекурсивно завершать foldl
мое умножение ***
по списку, но возвращать False
в момент, когда произведение становится равным нулю, а не ждать, пока полный продукт.
safelist :: [p] -> Bool
safelist [] = True
safelist (x:xs) = snd $ foldl' f (x,True) xs
where f (u,b) v = (w, b && w /= Zero) where w = u *** v
Я мог бы немного упростить этот код, используя монаду foldlM
монады Maybe
, но при этом, похоже, не хватает необходимой строгости.