gpt4 book ai didi

haskell - 使用 mfix 避免无限递归

转载 作者:行者123 更新时间:2023-12-03 16:47:44 25 4
gpt4 key购买 nike

让:

{-# LANGUAGE RecursiveDo #-}

test :: [a] -> Maybe Int
test [] = Just 0
test (_ : xs) = mdo
unless (i == 0) Nothing -- 1
i <- test xs -- 2
Just i
我正在寻找为什么打电话的解释,例如 test "hey"导致无限循环,通常如何在处理 mfix 时避免这种行为.另外,有没有办法在不交换(1)和(2)顺序的情况下更正前面的玩具示例?

最佳答案

这部分代码:

mdo unless (i == 0) Nothing
i <- test xs
Just i
脱糖:
mfix (\i -> do unless (i == 0) Nothing
j <- test xs
Just j)
重命名 i的绑定(bind)后至 j为清楚起见 do -表达。
第一个 mfix法律规定 mfix f = _|_ iff f is strict . f在这种情况下是:
\i -> do unless (i == 0) Nothing
j <- test xs
Just j
而且这个功能很严格。 (如果你用 f 调用 _|_ ,你会得到 _|_ 。)因此 mfix上面是 _|_根据定义。代回原来的,我们得到:
test []       = Just 0
test (_ : xs) = _|_
这表示除非你通过 test空列表,无论您传递给它的其他输入是什么,它总是会发散。
当然,这是它的理论方面。但实际上,我不明白您为什么要进行这种递归,将递归定义的函数与单值递归子部分混合。除非这仅仅是出于好奇,否则可能有更好的方法来构建您的程序以避免此问题。但为此,您必须分享更多信息,了解您究竟想要实现什么。

关于haskell - 使用 mfix 避免无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64412663/

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