Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 同时执行模式匹配和保护_Haskell - Fatal编程技术网

Haskell 同时执行模式匹配和保护

Haskell 同时执行模式匹配和保护,haskell,Haskell,我想对Maybe表达式执行模式匹配并同时应用一个保护,例如: myFunction :: Int -> Maybe Int myFunction x = --................. let val = myFunction 333 case val of Just val ??? if val > 0 ??? -> "> 0 " ++ show val Just val ??? if val == 0 ??? -> "== 0 "

我想对Maybe表达式执行模式匹配并同时应用一个保护,例如:

myFunction :: Int -> Maybe Int  
myFunction x = --.................

let val = myFunction 333 
case val of
  Just val ??? if val > 0 ??? ->  "> 0 " ++ show val  
  Just val ??? if val == 0 ??? -> "== 0 " ++ show val
  Just val ??? if val < -5 and > -10??? -> "< -5 and > -10 " ++ show val
  _ -> "otherwise"

错误是
输入时解析错误,

您可以使用
MultiWayIf
以良好的语法处理类似的问题:

{-# LANGUAGE MultiWayIf #-}
myFunction :: Int -> Maybe Int  
myFunction x = Just x

main = print $ 
  case myFunction 333 of
    Just val -> 
      if | val > 0  -> "> 0 " ++ show val  
         | val == 0 -> "== 0 " ++ show val
         | (val < -5 && val > -10) -> "< -5 and > -10 " ++ show val
         | otherwise -> "otherwise"
    _ -> "Nothing"
{-#语言多路If}
myFunction::Int->Maybe Int
myFunction x=仅为x
main=print$
第333号案件
只是val->
如果| val>0->>0“++显示val
|val==0->“==0”++显示val
|(val<-5&&val>-10)->“<-5和>-10”++显示val
|否则->“否则”
_->“没什么”

如果我没有弄错您的问题,您可以在Haskell 2010中定义函数时使用,如下所示:

myFunction m
    | Just val <- m, val > 0 = "> 0 " ++ show val
    | Just val <- m, val == 0 = "== 0 " ++ show val
    | Just val <- m, val < -5  && val > -10 = "< -5 and > -10 " ++ show val
    | otherwise = "otherwise"
mym函数
|仅val 0=“>0”++显示val

|仅val这可以通过正常的
案例
块来完成:

case myFunction 333 of
    Just val | val > 0               ->  "> 0 " ++ show val  
             | val == 0              -> "== 0 " ++ show val
             | val < -5 && val > -10 -> "< -5 and > -10 " ++ show val
    _ -> "otherwise"
案例myFunction 333 of
仅val | val>0->>0“++显示val
|val==0->“==0”++显示val
|val<-5&&val>-10->“<-5和>-10”++显示val
_->“否则”

不太清楚您想要做什么。
val
来自哪里?如果有一个
只是val
来自某个地方,它来自哪里?函数应该返回一个
可能是Int
,但实际上返回的是
字符串
,你的意思是说
myFunction::Int->Maybe Int->String
?你的第二个用例正是
PatternGuards
的目标:我现在不想使用任何扩展。@AlexanderSupertramp那么你将不得不使用
语句链,如果
语句,我将更新答案<上面的答案中提到的代码>图案保护
也需要一个扩展。@AlexanderSupertramp Nevermind!我认为jwodder的答案是最好的。我忽略了这一点。如果函数接受2个参数
myFunction mn
并返回可能的Int,那么我如何重写
| Just val 0=…
?您可以“链接”赋值,如| Just val1更新了您的第二个问题。谢谢。但是你确定这是一个有效的语法吗?“main”中的“do”在哪里?do被省略,因为每个案例只有一个动作。您可以像更新版本一样添加do。两者都是有效的语法。
m = Just 3 -- lookup collection123 "value123"
main  
  | Just val <- m, val > 0 = do
                  putStrLn $ "> 0 " ++ show val
  | Just val <- m, val == 0 = do 
                  putStrLn $ "== 0 " ++ show val
  | Just val <- m, val < -5 && val > -10 = do
                  putStrLn $ "< -5 and > -10 " ++ show val
  | otherwise = undefined
case myFunction 333 of
    Just val | val > 0               ->  "> 0 " ++ show val  
             | val == 0              -> "== 0 " ++ show val
             | val < -5 && val > -10 -> "< -5 and > -10 " ++ show val
    _ -> "otherwise"