Replies (15)

  • @segfault, Что не так?
  • @ndtimofeev, Зачем это?
  • @segfault, Один из тех случаев, когда странный инстанс позволяет компилироваться ошибочному коду изза слишком большой полиморфности.
  • @segfault, Не понял вопроса. Зачем нужен MonadThrow отдельно от MonadCatch? Или зачем нужен MonadThrow который не liftIO . throw ?
  • @ndtimofeev, Второе, а конкретно, зачем нужен инстанс `MonadThrow []`
  • @segfault, А… Ты про список… Ну вообще Кметт наркоман и совершенно не знает когда остановиться.
  • @segfault, Prelude Control.Monad.Catch> do { x <- [1,2,3]; y <-[4,5,6]; return $ x+y }
    [5,6,7,6,7,8,7,8,9]


    Prelude Control.Monad.Catch> do { x <- [1,2,3]; y <- throwM $ userError "lol"; return $ x+y }
    []

    Prelude Control.Monad.Catch Control.Applicative> do { x <- [1,2,3]; y <- (throwM $ userError "lol") <|> [5]; return $ x+y }
    [6,7,8]


    вроде норм..
  • @qnikst, Ну норм то норм, только есть же guard, ну и MonadThrow предполагает выбрасывание ошибки в IO
  • @segfault, Вообще-то не предполагает.
  • @segfault,
    MonadThrow предполагает выбрасывание ошибки в IO

    мне это не очевидно
  • @qnikst, A class for monads in which exceptions may be thrown.

    Instances should obey the following law:

    throwM e >> x = throwM e
    In other words, throwing an exception short-circuits the rest of the monadic computation.
  • @qnikst,
    It is a generalization of Control.Exception's throwIO.
    все что там написано по этому поводу. Ну и для чистых исключений есть `MonadExcept` плюс, пакет вроде как раз про исалючения в IO.
  • @segfault, мне не очевидно, что generalization не должно покрывать чистые монатки
  • @segfault, Что не отменяет того что в том же exceptions есть трансформер для чистых монаток, реализующий MonadThrow и MonadCatch.
  • @qnikst, вообще я бы этот инстанс не использовал (и не использую), но формально он законен..