Trovo che molte cose che faccio jigger da solo e che sembrano utili in realtà hanno un'implementazione standard che non conoscevo, quindi ero curioso se qualcuno potesse dire di aver visto questo tipo di cose usate prima :Questa funzione Haskell è conosciuta/implementata come un altro nome?
Ci vuole una funzione monadica e si piega fino a quando un predicato è scelto da alternativa poi restituisce il risultato del predicato:
until :: (Monad m, Alternative m) => (a -> m a) -> (a -> m c) -> a -> m c
f `until` p = \a -> (f >=> (p `altF` (until f p))) a
where f1 `altF` f2 = \a -> f1 a <|> f2 a
mi rendo conto che il nome è una collisione preludio, io probabilmente chiamatelo in un altro modo, ma pensavo che prima avrei visto se c'è già una funzionalità simile in una libreria standard di cui non so nulla ...
Immagino anche di essere curioso di sapere se l'alternativa compositiva che ho scritto sia definita altrove o se qualcuno di questo aspetto della funzionalità sembra fuorviante. Ma il punto cruciale della mia domanda è, è implementato altrove o è qualcosa di molto simile implementato altrove forse
Si potrebbe voler usare 'MonadPlus' piuttosto che i vincoli' Monad' e 'Alternative' combinati. –
@pelotom È possibile definire l'alternativa in termini di MonadPlus? Non ero a conoscenza, ho appena preso la mia firma direttamente da GHCi –
Definiscono API diverse ma svolgono ruoli simili ... 'Alternativa':' Applicativa' :: 'MonadPlus':' Monade'. –