[英]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.