Monadic if - 它是如何工作的?

1 monads haskell

ifM 实施方式如下:

ifM p t f  = p >>= (\p' -> if p' then t else f)
Run Code Online (Sandbox Code Playgroud)

而另一个函数while2使用ifM这样的,

while2 x y = ifM x (return ()) $ ifM y (return ()) $ while2 x y 
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • ifM有三个参数.他们的类型是什么?(我理解为,p - 谓词函数,t - 真函数块,f - 假函数块)

  • ifM内部的使用中while2,什么时候进行参数评估?之后的参数是否$首先得到评估,并且它们的值作为参数传递给while2

  • 这是什么ifM做,if不能做的?

Sib*_*ibi 5

它的类型是:

ifM :: Monad m => m Bool -> m a -> m a -> m a 
Run Code Online (Sandbox Code Playgroud)

要了解它是如何工作的,您可以测试它ghci并找出它的行为:

?> ifM (return True) (print "true") (print "false")
"true"
?> ifM (return False) (print "true") (print "false")
"false"
Run Code Online (Sandbox Code Playgroud)

因此,基于第一个monadic布尔参数的结果,执行任一个monadic表达式.它与ifmonadic值的方式不同.

while2有这种类型的签名:

while2 :: Monad m => m Bool -> m Bool -> m ()
Run Code Online (Sandbox Code Playgroud)

通过查看此示例,您可以了解其工作原理:

?> while2 (print "hello" >> return True) (return True)
"hello"
?> while2 (print "hello" >> return True) (print "bye" >> return True)
"hello"
?> while2 (print "hello" >> return False) (print "bye" >> return True)
"hello"
"bye"
Run Code Online (Sandbox Code Playgroud)

所以在while2函数中,执行第一个monadic值.如果它是Sevaluates True,则return ()执行.如果它是假的,则ifM y (return ()) $ while2 x y执行相同的规则ifM.现在,如果y求值为False,while2 则以递归方式再次计算,导致无限循环:

?> while2 (print "hello" >> return False) (print "bye" >> return False)
"hello"
"bye"
"hello"
"bye"
"hello"
"bye"
"hello"
"bye"
C-c
Run Code Online (Sandbox Code Playgroud)