我使用在其中一個模塊中定義的功能if'
而不是內置的if-then-else
構造。它是平凡的定義,工作得很好。在我的程序中解除「if」功能的意外行爲
但是,在代碼中有一個地方需要將它應用於monad值(我的情況爲IO
),即類型簽名應該看起來有點像IO Bool -> IO a -> IO a -> IO a
。當然,我試圖解除它。
if' <$> mb <*> action1 <*> action2
但是,當我試圖評估表達式,我沒有得到我所期望的。
*Main> if' <$> return True <*> putStrLn "yes" <*> putStrLn "no"
yes
no
我知道<*>
說明寫着「序貫應用」,所以也許它是。但是這裏發生了什麼?我可以在不寫一個全新的專用功能的情況下修復它嗎?
在上一個表達式中,if語句只控制返回的值 - 爲了甚至計算這些值,兩個分支都必須執行,因爲它使用IO的應用接口。如果'b(putStrLn「是」)(putStrLn「no」),你可能希望'返回True >> = \ b - >' - 注意'if'直接應用於不同分支。 – user2407038