Jak ściśle składa się monada? Data.Foldable
ma ścisły kod foldl'
i monadyczny foldlM
, ale nie ma ścisłej definicji foldlM'
? Czy surowość jest w jakiś sposób zdefiniowana przez samą monadę? Jeśli tak, to w jaki sposób można ustalić, co to jest?Czy Haskell ma foldlM?
Wyobraź sobie, że muszę ustalić, czy iloczyn olbrzymiej listy elementów pierścienia wynosi zero, ale mój pierścień nie jest domeną integralną, tj. Zawiera zero wzorca. W takim przypadku powinienem przekierować rekurencyjnie foldl
moje mnożenie ***
nad listą, ale zwracam False
w momencie, gdy produkt stanie się zero, zamiast czekać na pełny produkt.
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
I być może nieco uprościć ten kod za pomocą Maybe
monada na foldlM
ale robi tak pozornie brakuje wymaganej surowości.
Ahh, przypuszczam, że monada mogłaby robić rzeczy ścisłe, jeśli miałaby w sobie ostre flagi, ale nie inaczej. I nie robią tego żadne standardowe monady. Dzięki! –
@JeffBurdges - oto rodzaj obserwacji ad-hoc, której Monadyczne '> =' są ścisłe vs leniwy: http://stackoverflow.com/a/8250334/208257 –
Rzeczywiście, wątpię, że 'foldM'' pomoże, jeśli twoje '(>> =)' jest zbyt leniwe, ponieważ np wymuszenie wartości zwróconej przez leniwą Monadę 'State' niekoniecznie wymusza stan. – ehird