Haskell 同时执行模式匹配和保护
我想对Maybe表达式执行模式匹配并同时应用一个保护,例如: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 "
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"