4

私は、リストのモナドの中で関数が適用されるコードを持っています。関数は、その引数に対して非網羅的パターンマッチングを潜在的に持つことがあります。したがって、この機能を適用すると、"Non-exhaustive pattern matching"エラーが発生することがあります。私はこのエラーをモナドに失敗させたい(この場合は空のリスト)。言い換えれば、ブロック内のSome Pattern Here <- some valueブロックが失敗したときに起こることと同様の動作をしたいと思います。ハスケルの安全なアプリケーション

質問効率的な関数アプリケーションを安全にする方法はありますか?効率的には、適用された関数を徹底的に一致させて明示的に失敗させることに類似したものを意味します。

+0

質問は不明です。あなたがリストのモナドに入っているので、do-construct内でパターンマッチングをしたり、そうでない場合には明示的なcase構文を使用するのはなぜですか?サンプルコードを投稿する方がよいでしょう。 – is7s

答えて

3

1つのオプションは、spoonを使用して、例外をスローする関数からMaybe a値を返す関数に変換することです。次に、Nothing[]に変換するだけの簡単な問題です。

+4

スプーンが積極的に宣伝されるべきかどうかは分かりませんが、このスレッドを参照してくださいhttp://www.reddit.com/r/haskell/comments/acasn/tired_of_functions_that_could_live_in_maybe_but/ –

+0

おそらくそれを使用するリスクはありません。とにかく、私はこれが私が求めたものに最も近いものだと信じています。 – julkiewicz

+2

私はスプーンが大丈夫だと思います。うん、それは理論的な性質や物を壊しますが、ライブラリの目的は、(理論的にはこのような性質を持っていてもうまくいく方法では定義されていない)厄介なコードを扱うことです。代わりにゼロから再実装する(またはこの場合、解析してユーザのコードを修正する)場合、スプーンは素晴らしい代替手段です。 – luqui

2

ハム、おそらくキャッチと?ただし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 
+0

'IO'モナドはオプションではありません。私は自分のコードをできるだけ純粋なものにしています。 – julkiewicz

+2

私の知る限りでは、そのような例外を処理するためにのみ 'catch'を使うことができます(あなたはIOで作業するよう強制されます)。ダニエルが提案したスプーン(安全でない操作を使用する)を使用したくない場合は、他のオプションがない可能性があります。 –

+0

さて、否定的な答えはまだ答えです。ありがとう。 – julkiewicz

関連する問題