(新手问题.:-))
假设您有一系列操作(对外界进行健全性检查).如果理智失败,就必须大声疾呼.
但是,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)
推断类型是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.
最简单的事情是return ().有迹象表明,这样做的部分对你来说,即一些方便的功能when和unless; 你的例子很简单holler msg test = unless test (fail msg).
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |