Monadic if - 它是如何工作的?

Monadic if - how it works?

ifM 实现为:

ifM p t f  = p >>= (\p' -> if p' then t else f)

另一个函数 while2 像这样使用 ifM

while2 x y = ifM x (return ()) $ ifM y (return ()) $ while2 x y 

我的问题是:

type是:

ifM :: Monad m => m Bool -> m a -> m a -> m a 

要查看它是如何工作的,您可以在 ghci 中对其进行测试并找出它是 行为:

λ> ifM (return True) (print "true") (print "false")
"true"
λ> ifM (return False) (print "true") (print "false")
"false"

所以根据第一个monadic布尔参数的结果,执行monadic表达式中的任何一个。它与普通 if 的不同之处在于它采用单子值的方式。

while2 具有此类型签名:

while2 :: Monad m => m Bool -> m Bool -> m ()

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

λ> 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"

所以在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