(新手问题:-))
假设您有一系列操作(对外界进行健全性检查)。如果理智失败,就必须大声喊叫。
但是,Haskell ifs需要定义两个分支。 fail
的案例是monad。但是,我不确定在else情况下生成的正确类型是什么。编译器认为推断类型是IO a。但是,我不确定如何创建无操作IO。
holler msg test =
do
if not test
then
fail msg
else
-- ??? no-op
main :: IO ()
main = do
holler "Go" True
答案 0 :(得分:9)
推断类型为IO a
,因为fail msg
可能会返回任何内容(因为它实际上永远不会返回)。然而,else部分实际上不必生成IO a
,将它变成更具体的内容(即IO WhateverYouWant
)是完全可以的。
在这种情况下,您不关心返回值,因此您应该使用IO ()
,即将return ()
放在else
的情况下。
事实证明,when condition action
模块中已经有一个名为Control.Monad
的函数,它完全正确if condition then action else return ()
,因此您可以使用该函数(或其对应unless
}},否定了保存not
)的条件,而不是输入if
。
答案 1 :(得分:8)
最简单的事情是return ()
。有一些方便的功能可以帮助你,when
和unless
;您的示例只是holler msg test = unless test (fail msg)
。