Rodzaj (>>=)
jestfunkcję podobną do (>> =), ale zwraca inną monada
(>>=) :: Monad m => m a -> (a -> m b) -> m b
chcę funkcję, która ma typ:
(Monad m, Monad n) => m a -> (a -> n b) -> n b
Funkcja ta mogłaby być używane do łączenia ze sobą różnych monad.
I w obliczu tego problemu, gdy starałem się dostać 3000
z argumentów wiersza polecenia -p 3000
:
main = getArgs >>= (\args -> (elemIndex "-p" args) >>= (\id -> warpDebug (fromIntegral.read (args !! (id+1))) Ilm))
To wyraźnie nie będzie skompilować ponieważ getArgs
zwraca IO [String]
i elemIndex
zwraca Maybe Int
. Funkcja powyższego typu może być użyta do eleganckiego rozwiązania tego problemu. Moje pytanie brzmi:
- Czy ta funkcja jest już zdefiniowana? (Hoogle nie znaleziono żadnych)
- Jeśli nie, prawdopodobnie wynika to z jakiegoś powodu. Jaki jest więc powód? Czy jest to uważane za złą praktykę? Myślę, że jest to lepszy sposób niż użycie wyrażenia case.