2016-04-28 7 views
2

私はハスケルにインタプリタを書いていますが、map:name_of_function - >関数の定義を持っています。`おそらく`を扱うときに `case`を避ける方法

Map String Defun 

マイ通訳モナド:

type InterpreterMonad = StateT (EnvFun, (Stack EnvEval)) (ErrorT String IO)() 

そして、あなたが見ることができるように、 "最後の" モナドはErroTです。今

、私はハンドルを呼び出す機能を希望する場合:

handleFCall :: Stmt -> InterpreterMonad 
    handleFCall (VarName name) args = get >>= \(envFun, contextStack) -> case (Map.lookup (VarName name) envFun) of 
     Nothing -> throwError "Err" 
     (Just x) -> DoSthOther 

をそして、あなたが見ることができるように私はcaseを使用する必要があります。しかし、私は>>=を使用していますので、ここではcase ofを避けたいと思います。しかし、Map.lookup返信Nothingが失敗しました。私はエラーメッセージを追加したいと思います。

私はハスケルでの経験がないので、それに対処する方法がわかりません。私のコードに対するすべての批判は大歓迎です。

乾杯。

答えて

4

あなたの機能は、より

他のHaskellプログラマにより熟知しているであろう
handleFCall (VarName name) args = do 
    (envFun, contextStack) <- get 
    case Map.lookup (VarName name) envFun of 
     Nothing -> throwError "Err" 
     Just x -> doSthOther x 

ようになり表記しないと再フォーマットが、case文を使うことには何も問題は、ありません。

handleFCall (VarName name) args = do 
    (envFun, contextStack) <- get 
    maybe (throwError "Err") doSthOther $ Map.lookup (VarName name) envFun 

それとも

handleFCall (VarName name) args 
    = get >>= 
     (\(envFun, contextStack) -> 
      maybe (throwError "Err") doSthOther 
       $ Map.lookup (VarName name) envFun 
     ) 

>>=と個人的に、私はcase文を読み見つける:あなたは本当にケースを使用しないようにしたい場合は、単にmaybe関数を使用します。

0

errors packageControl.Error.Utilで以下の操作を持っている(とControl.Errorから再輸出):特に

-- You can turn `Maybe` into `Either` by supplying a constant to use 
-- for the `Left` case. 
note :: a -> Maybe b -> Either a b 

-- Ditto for `MaybeT` and `ExceptT` 
noteT :: Monad m => a -> MaybeT m b -> ExceptT a m b 

-- And there are useful shortcuts for other combinations 
failWith :: Applicative m => e -> Maybe a -> ExceptT e m a 

failWithは、それがここで非常にうまく収まるようにように、この式のようなものは、トリックを行うだろうに見えます。

failWith "Err" (Map.lookup (VarName name) envFun) 

(上記の署名が使用されているよう)あなたがerrorsを使用するためにそれに応じてコードを変更する必要があると思いますので、あなたの例で使用しているErrorT変圧器は、ExceptTの賛成で廃止されていることに注意してくださいパッケージ。一方、これらの機能は、あなたが好むならば、あなた自身で焼くことができるほど簡単です。

関連する問題