2013-07-04 78 views
15

今天,我發現自己輸入以下代碼:情況下多路如果

case() of 
    _ | x < 15 -> ... 
    _ | x < 25 -> ... 
    _ | x < 50 -> ... 
    _   -> ... 

這樣做的意義是不夠直接,但它只是覺得... 錯誤亂說case()。有人有更好的建議嗎?

我想因爲我對品牌x,我可以寫case x。但是,這仍然讓我沒有任何實際的模式匹配;這都是關於警衛。這仍然感覺很奇怪。

+2

什麼[多路IF](http://www.haskell.org/gh c/docs/7.6.2/html/users_guide/syntax-extns.html#multi-way-if)在更新版本的GHC中使用? – Vitus

+6

功能有問題嗎? 'f x | x <15 = ...; | x <25 = ...; ...' –

回答

14

case()沒有錯;除非您想使用GHC的multi-way-if等最新的句法和非標準擴展,否則這是最好的用例。

14

也有人提到,如果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 
+0

如果只有一個人不必爲'r'命名,這會很好。 –

+0

我們應該製作一個LambdaMultiWayIf擴展嗎? –

+0

一個多路如果實際上沒有監視器。那麼你想對匿名論證做什麼? –

2

您可以利用惰性求拿出這樣的:

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 
+0

您也可以使用列表解析,如在「concat $ [[putStrLn」15「| x <15],[putStrLn」25「| x <」25「],...] – bennofs

+4

另外,'fromJust $ x <|> Just y'是一種相當複雜的寫作方式'fromMaybe yx' –