确定正确的例外类型

Pau*_*han 5 monads haskell

(新手问题.:-))

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

但是,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
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 9

推断类型是IO a因为fail msg可能返回任何内容(因为它实际上永远不会返回).然而,其他部分实际上并不需要产生一个IO a,它完全可以使它成为更具体的东西,即IO WhateverYouWant.

在这种情况下,你不关心的返回值,所以你应该只使用IO (),即放return ()else情况.

事实证明when condition action,Control.Monad模块中已经有一个函数调用,它完全正确if condition then action else return (),所以你可以使用那个(或它的对应物unless,这可以消除条件来拯救你not),而不是输入if.


Dan*_*ner 8

最简单的事情是return ().有迹象表明,这样做的部分对你来说,即一些方便的功能whenunless; 你的例子很简单holler msg test = unless test (fail msg).

  • @Paul:`import Control.Monad`,或下次,[问Hoogle](http://haskell.org/hoogle/?hoogle=unless). (3认同)