他们,我有问题。我的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?
答案 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
中的First
和Last
包装来实现这两个版本。
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