2016-08-16 274 views
0

我想在斯卡拉它看起來像這樣模式匹配

validate(number) match { 
case true => "true" 
case false => "false" 
} 

我試圖做在Haskell

main = do  
    number <- getLine 
    res <- case (validate (read number::Int)) of 
     (True) -> "True" 
     (False) -> "False" 
    putStrLn res 

而且類似的東西做函數結果 比賽我明白我可以用do表示法做到,但不知道從哪裏開始。

+2

「做」是*單子語法糖*。 「真正的」底層版本是'main = getLine >> = \ number - > case ...'。但你應該首先了解* Functors *和* Applicative *。這些是搜索條件,讓你開始。預告片:'main =(可能是「False」useTheValue。readMaybe)<$> getLine' – MarLinn

+0

謝謝,絕對是在路線圖上。 – raam86

回答

4

如果存在解析錯誤,則在Haskell read中引發異常。

但是有readMaybe這將返回一個Maybe值。

import Text.Read 

main = do 
    number <- getLine 
    let res = case (readMaybe number :: Maybe Int) of 
       Just x -> "True" 
       Nothing -> "False" 
    putStrLn res 

注意因爲readMaybe使用let代替一元bind操作符<-是純函數。

你甚至可能能夠避免類型提示,如果你的方式,讓編譯器推斷出它的類型使用解析 值,例如:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 
    -- any list will do 

main = do 
    number <- getLine 
    case readMaybe number of 
    Nothing -> putStrLn "bad number" 
    Just n -> print (fibs !! n) 

這裏不再類型的註釋,因爲!!採取Int論點, 等等n必須有類型Int 這意味着readMaybe number必須有類型Maybe Int

更新

風格上我會建議你使用let這裏 - 使用 綁定是完全不必要的,因爲你是計算一個純粹的價值。

但是,您可以通過使用return與綁定運營商這樣寫:

main = do 
    number <- getLine 
    res <- return $ case (readMaybe number :: Maybe Int) of 
        Just _ -> "True" 
        Nothing -> "False" 
    putStrLn res 
+0

這是非常好的。然而,這仍然不能與綁定操作符,我是對嗎? – raam86

+0

你爲什麼要使用綁定操作符?但如果你覺得你必須,我已經更新了答案。 – ErikR

+0

我只是不知道如何以及何時使用。非常感謝您的寶貴時間! – raam86