我是第一次在 Haskell 中編碼,但我在使用 case 陳述句時遇到了問題。
points = do
pts <- try(readLn :: IO Int) :: IO (Either SomeException Int)
case pts of
Left ex -> putStrLn "Please enter a number."
Right val -> return pts
此代碼用于從用戶輸入中讀取一個整數,并檢查以確保它確實是一個 int。我遇到的問題是左案。我想做的是,如果有例外,列印“請輸入數字”行。然后再次運行 points 函式。問題是我無法弄清楚如何在 Left ex 案例中呼叫點,因為它會干擾 print 陳述句。有什么指導嗎?
uj5u.com熱心網友回復:
您可以使用do符號,它允許IO按順序粘合多個(或另一個 monad)動作,就像您已經在其points自身中所做的那樣:
points = do
pts <- try(readLn :: IO Int) :: IO (Either SomeException Int)
case pts of
Left ex -> do
putStrLn "Please enter a number."
points
Right val -> return pts
或者,您可以執行do符號在引擎蓋下所做的事情,并使用>>=運算子,這是IO按順序粘合兩個動作的原因:
points = do
pts <- try(readLn :: IO Int) :: IO (Either SomeException Int)
case pts of
Left ex -> putStrLn "Please enter a number." >>= \_ -> points
Right val -> return pts
請注意,該\_ ->位忽略第一個操作的回傳值。所以你可以使用>>運算子,它與 做同樣的事情>>=,但會丟棄第一個動作的結果:
points = do
pts <- try(readLn :: IO Int) :: IO (Either SomeException Int)
case pts of
Left ex -> putStrLn "Please enter a number." >> points
Right val -> return pts
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/513456.html
標籤:哈斯克尔递归开关语句
