簡體   English   中英

Haskell如果那么“兩個陳述”

[英]Haskell if then else with “two statements”

我怎樣才能做到這一點:

if n > 0
then putStrLn "Hello"
     putStrLn "Anything"

我希望在一個條件中有“兩個語句”,但我不斷收到編譯錯誤

我嘗試使用分號而沒有運氣

then只能取一個值....不過你很幸運,因為do搗毀多個IO()值轉換成一個....

if n > 0
  then do
    putStrLn "Hello"
    putStrLn "Anything"
  else return ()

請記住,在Haskell中,您還需要一個else (並且return ()創建無效的普通IO() )。

你的例子在Haskell中沒有意義。 每個表達式都需要有一個值,這就是為什么你總是需要有一個else ,即使它只是return ()

因為它需要是一個單獨的表達式,所以你不能這樣做

putStrLn "Hello"
putStrLn "Anything"

因為它們是IO ()類型的兩個表達式,這意味着它是具有一些外部效果的計算,並且沒有結果。 您有兩個需要在序列中運行的計算,可以使用>>組合器完成

putStrLn "Hello" >> putStrLn "Anything"

還有一種使用do塊的替代語法。

do
  putStrLn "Hello"
  putStrLn "Anything"

這里要注意的重要一點是, 這將編譯為與上面示例相同的>>代碼。 do塊可以被認為是語法糖(還有更多的東西,但為了簡單起見,你可以這樣想。)

把這一切放在一起就離開了我們

if n > 0
then putStrLn "Hello" >> putStrLn "Anything"
else return ()

或使用do塊

if n > 0
then do
  putStrLn "Hello"
  putStrLn "Anything"
else return ()

因為這種模式是相當普遍的,有when組合子(在Control.Monad ),其目的正是這個

when (n > 0)
  do
    putStrLn "Hello"
    putStrLn "Anything"

或者只是簡單地

when (n > 0) (putStrLn "Hello" >> putStrLn "Anything")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM