Есть ли в Haskell 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 , но при этом, похоже, не хватает необходимой строгости.

9
задан Jeff Burdges 18 January 2012 в 23:24
поделиться