今天,我發現自己輸入以下代碼:情況下多路如果
case() of
_ | x < 15 -> ...
_ | x < 25 -> ...
_ | x < 50 -> ...
_ -> ...
這樣做的意義是不夠直接,但它只是覺得... 錯誤亂說case()
。有人有更好的建議嗎?
我想因爲我對品牌x
,我可以寫case x
。但是,這仍然讓我沒有任何實際的模式匹配;這都是關於警衛。這仍然感覺很奇怪。
今天,我發現自己輸入以下代碼:情況下多路如果
case() of
_ | x < 15 -> ...
_ | x < 25 -> ...
_ | x < 50 -> ...
_ -> ...
這樣做的意義是不夠直接,但它只是覺得... 錯誤亂說case()
。有人有更好的建議嗎?
我想因爲我對品牌x
,我可以寫case x
。但是,這仍然讓我沒有任何實際的模式匹配;這都是關於警衛。這仍然感覺很奇怪。
case()
沒有錯;除非您想使用GHC的multi-way-if等最新的句法和非標準擴展,否則這是最好的用例。
也有人提到,如果case
如果存在,罰款和輯陣路,但我通過去哪兒爲本地功能或讓聲明:
someFunction = do
x <- monadicOp
let f y | y < 5 = expr1
| y < 15 = expr2
| y < 25 = expr3
| True = expr4
f x
這在語法上是比case語句液清潔劑並且比多路如果更便攜。
編輯:
如果它是不明確的,如果該值進行比較,x
在這種情況下,已經在範圍上,當你定義守衛功能(f
),那麼你可以只定義一個值,而不是:
someFunction = do
x <- monadicOp
let r | x < 15 = expr1
| x < 25 = expr2
r
如果只有一個人不必爲'r'命名,這會很好。 –
我們應該製作一個LambdaMultiWayIf擴展嗎? –
一個多路如果實際上沒有監視器。那麼你想對匿名論證做什麼? –
您可以利用惰性求拿出這樣的:
import Data.List
import Data.Maybe
import Control.Applicative
cases :: [(Bool,a)] -> a -> a
cases lst d = snd $ fromJust $ (find fst lst) <|> Just (True,d)
main = do
let x = 20
r = cases [(x < 15, putStr "15"),
(x < 25, putStr "25"),
(x < 50, putStr "50")] $ putStr "None"
in
r
您也可以使用列表解析,如在「concat $ [[putStrLn」15「| x <15],[putStrLn」25「| x <」25「],...] – bennofs
另外,'fromJust $ x <|> Just y'是一種相當複雜的寫作方式'fromMaybe yx' –
什麼[多路IF](http://www.haskell.org/gh c/docs/7.6.2/html/users_guide/syntax-extns.html#multi-way-if)在更新版本的GHC中使用? – Vitus
功能有問題嗎? 'f x | x <15 = ...; | x <25 = ...; ...' –