Haskell 确定异常的正确类型
(新手问题:-) 假设您有一系列操作(对外部世界的健全性检查)。如果心智不健全,就必须大声叫喊 但是,Haskell ifs要求定义两个分支。Haskell 确定异常的正确类型,haskell,monads,Haskell,Monads,(新手问题:-) 假设您有一系列操作(对外部世界的健全性检查)。如果心智不健全,就必须大声叫喊 但是,Haskell ifs要求定义两个分支。fail的情况是单子。但是,我不确定在else情况下生成的正确类型。编译器认为推断的类型是IO a。然而,我不知道如何创建一个无操作IO a holler msg test = do if not test then fail msg else -- ??? no-op main :: I
fail
的情况是单子。但是,我不确定在else情况下生成的正确类型。编译器认为推断的类型是IO a。然而,我不知道如何创建一个无操作IO a
holler msg test =
do
if not test
then
fail msg
else
-- ??? no-op
main :: IO ()
main = do
holler "Go" True
最简单的方法是
返回()
。有一些方便的函数可以为您完成这一部分,即when
和除非;您的示例就是holler-msg-test=except test(fail-msg)
推断的类型是IO a
,因为fail-msg
可能返回任何内容(因为它实际上从不返回)。然而,else部分实际上不必生成ioa
,将其转换为更具体的内容是完全可以的,即iowhateyouwant
在这种情况下,您不关心返回值,因此应该只使用IO()
,即将return()
放在else
案例中
事实证明,Control.Monad
模块中已经有一个名为when condition action
的函数,它确实执行if condition then action else return()
,因此您可以使用该函数(或者它的对应项,除非
,它否定了条件,从而保存了not
)而不是键入if
嗯,好的。我得到了一个“不在范围内”的错误时间&除非,谷歌没有帮助我。我猜它在一个库中?@Paul:导入控件.Monad
,或者下次,.Yes,导入控件.Monad
。将来,(,)是Haskell函数的首选搜索引擎。