Как можно строго сложить монаду?Data.Foldable
имеет строгий foldl'
и монадический foldlM
, но не строгий foldlM'
?Строгость как-то определяется самой монадой?Если так, как можно понять, что это такое?
Представьте, что я должен определить, является ли произведение огромного списка элементов кольца нулевым, но мое кольцо не является интегральной областью, то есть содержит ноль девизоров.В этом случае я должен рекурсивно подсчитывать 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
, но для этого, по-видимому, не хватает необходимой строгости.