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
我的问题是:
ifM 接受三个参数。它们的类型是什么? (我理解为,p - 谓词函数,t - 真函数块,f - 假函数块)
在ifM
里面while2
的用法中,参数什么时候
评估发生了什么? $
之后的参数是否首先被评估并将它们的值作为参数传递给 while2
什么是 ifM
能做到而 if
不能做到的?
是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
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
我的问题是:
ifM 接受三个参数。它们的类型是什么? (我理解为,p - 谓词函数,t - 真函数块,f - 假函数块)
在
ifM
里面while2
的用法中,参数什么时候 评估发生了什么?$
之后的参数是否首先被评估并将它们的值作为参数传递给while2
什么是
ifM
能做到而if
不能做到的?
是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