gpt4 book ai didi

haskell - Monadic if - 它是如何工作的?

转载 作者:行者123 更新时间:2023-12-02 01:00:07 25 4
gpt4 key购买 nike

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 - 真函数 block ,f - 假函数 block )

  • while2ifM的用法中,参数什么时候评估发生了什么? $ 之后的参数是否首先被求值并将它们的值作为参数传递给 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 bool 参数的结果,执行 monadic 表达式中的任何一个。它与普通的 if 的不同之处在于它采用 monadic 值的方式。

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

关于haskell - Monadic if - 它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29717327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com