ハム、おそらくキャッチと?ただしIO
モナドで動作するはずです:
import Prelude hiding (catch)
import Control.Monad (MonadPlus, mzero)
import Control.Exception (catch, SomeException)
data B = T | F
deriving (Show)
f :: B -> B
f T = F
justCatch :: (MonadPlus m) => a -> IO (m a)
justCatch x = catch (x `seq` (return . return) x) handler
where
handler :: (MonadPlus m) => SomeException -> IO (m a)
handler _ = return mzero
私はこのソリューションの潜在的な問題についてはよく分かりません。一見それはうまくいくようですが、知識のあるハスケラーの意見も読んでみたいと思います。 私はではない私のコードでこの解決策を確実に使用してください。エラーは、それを隠すことなくそのまま扱うべきです。
*Main> justCatch $ f T :: IO [B]
[F]
*Main> justCatch $ f F :: IO [B]
[]
*Main> justCatch $ f F :: IO (Maybe B)
Nothing
*Main> justCatch $ f T :: IO (Maybe B)
Just F
*Main> f T
F
*Main> f F
*** Exception: except.hs:8:1-7: Non-exhaustive patterns in function Main.f
質問は不明です。あなたがリストのモナドに入っているので、do-construct内でパターンマッチングをしたり、そうでない場合には明示的なcase構文を使用するのはなぜですか?サンプルコードを投稿する方がよいでしょう。 – is7s