确定正确的例外类型

时间:2011-08-02 21:50:01

标签: haskell monads

(新手问题:-))

假设您有一系列操作(对外界进行健全性检查)。如果理智失败,就必须大声喊叫。

但是,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

2 个答案:

答案 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 ()。有一些方便的功能可以帮助你,whenunless;您的示例只是holler msg test = unless test (fail msg)