Haskell 确定异常的正确类型

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

(新手问题:-)

假设您有一系列操作(对外部世界的健全性检查)。如果心智不健全,就必须大声叫喊

但是,Haskell ifs要求定义两个分支。
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函数的首选搜索引擎。