Haskell:在Haskell中处理错误/异常

时间:2017-01-29 00:34:25

标签: 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 个答案:

答案 0 :(得分:3)

我们通常在Haskell中处理失败的函数,返回Maybe类型:

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'

通过不对Env进行插入更新,符合您的预期含义。 insertEnv的另一种可能性是“更新”环境:

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

如果您有兴趣,可以使用Data.Monoid中的FirstLast包装来实现这两个版本。

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

有一些环境

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

如果您选择First并执行上述实施,则

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

Last

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

答案 1 :(得分:2)

  

使用其他函数<div class="one">XYZ</div> <div class="two">ABC</div> <script> $( document ).ready(function() { var $showDIV = two; if($showDIV == 'one' ){ $(".one").show(); }else if($showDIV == 'two' ){ $(".two").show(); } }); <script> ,您可以将元素插入insertEnv。但是,您需要检查Env是否为空。

为什么在插入内容之前需要检查环境是否为空?包含变量Env的环境只是一个函数,如果给定名称为x,则返回x绑定的值。

x