Come si piega rigorosamente una monade? Data.Foldable
ha il severo foldl'
e il monadico foldlM
, ma non rigoroso foldlM'
? La rigidità è in qualche modo definita dalla stessa monade? Se è così, come si fa a capire di cosa si tratta?Haskell ha foldlM '?
Immaginate di dover determinare se il prodotto di un'enorme lista di elementi dell'anello è zero, ma il mio anello non è un dominio integrale, cioè contiene zero devisori. In questo caso, dovrei tail ricorsivamente foldl
la mia moltiplicazione ***
nell'elenco, ma restituire False
nel momento in cui il prodotto diventa zero, piuttosto che attendere il prodotto completo.
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
potrei forse semplificare questo codice un po 'usando la monade del foldlM
Maybe
ma così facendo manca apparentemente il rigore necessario.
Ah, suppongo che la monade potrebbe rendere le cose rigide se avesse bandiere rigide, ma non altrimenti. E nessuna monade standard lo fa. Grazie! –
@JeffBurdges - ecco una sorta di osservazione ad-hoc di cui Monadic '>> =' sono severi contro pigri: http://stackoverflow.com/a/8250334/208257 –
In effetti dubito che 'foldM'' sarebbe d'aiuto se il tuo '(>> =)' è troppo pigro, poiché ad es forzare un valore restituito dalla lazy 'State' monad non forza necessariamente lo stato. – ehird