2017-01-29 3 views
0

皆さん、私には問題があります。私はHaskellプログラムに2つの機能を持っています。Haskell:Haskellでのエラー/例外の処理

type Env = String -> Int 

emptyEnv :: Env 
emptyEnv _ = error "Failed" 

insertEnv :: String -> Loc -> Env -> Env 
insertEnv s loc env = case env s of 
         (error "Failed") -> (\inp -> (if inp==s then loc else env s)) 
         _ -> env 

したがって、私のemptyEnvは常にエラーメッセージを表示する必要があります。他の関数insertEnvを使用すると、要素をEnvに挿入できます。しかし、Envが空であるかどうかを確認する必要があり、画面にエラーが表示されます。今私の質問:エラー "失敗"は、関数のinsertEnvのenvのケースではないため、上記のコードは動作しません。あなたは、envに要素を挿入できるようにエラーを適切に処理する方法を知っていますか?

答えて

2

他の関数insertEnvでは、要素をEnvに挿入できます。しかし、Envが空であるかどうかを確認する必要があります。

何かを挿入する前に環境が空であるかどうかをチェックする必要があるのはなぜですか?変数xを含む環境は、名前がxの場合、xがバインドされた値を返す関数に過ぎません。

type Loc = Int 
type Env = String -> Maybe Loc -- Here 

emptyEnv :: Env 
emptyEnv _ = Nothing 

そして、私たちが書くでしょうinsertEnv用:

作らないことで、あなたの意図する意味を次の
insertEnv :: String -> Loc -> Env -> Env 
insertEnv s loc env inp = 
    case env inp of 
    Nothing -> 
     if s == inp 
     then Just loc 
     else Nothing 
    Just loc' -> Just loc' 

insertEnv s loc env = \v -> if v == s then loc else env v 
3

我々は通常、彼らがMaybe型を返すことにより、Haskellの中に障害が発生した機能を扱いますインサートはEnvを更新します。あなたが興味を持っている場合

insertEnv' :: String -> Loc -> Env -> Env 
insertEnv' key loc env inKey 
    | key == inKey = Just loc 
    | otherwise = env inKey 

、両方のバージョンがData.MonoidからFirstLastラッパーを使用して実装することができます。insertEnvのためのもう一つの可能​​性は、環境を「更新」することです。いくつかの環境

env1 = insertEnv' "1" 2 (insertEnv' "1" 1 emptyEnv') 

import Data.Monoid 

type Env' = String -> First Loc -- Choose First or Last here 

emptyEnv' :: Env' 
emptyEnv' _ = mempty 

insertEnv' :: String -> Loc -> Env' -> Env' 
insertEnv' s loc env inp = 
    env inp <> 
    if s == inp 
    then pure loc 
    else mempty 

あなたは上記の実装でFirstを選ぶ場合は、

GHCI> env1 "1" 
First {getFirst = Just 1} 

またはLast

GHCI> env1 "1" 
Last {getLast = Just 2} 
+0

おかげadamseで取得します。すぐに話題から離れます。今度は、 'emptyEnv = \ _->( - 1)'と 'insert en loc = inp - >(inp == sならばloc else env s)'を使ってみましたが、今は 'env = "x" 42を挿入する( "y" 17 emptyEnvを挿入する) 'それから' env "y" '空のEnvの値を-1にする。何が起こっている?それは5分前に働いた! –

+0

'... else env inp'が必要です。 – adamse