Maybe impossible 的 mfix 是非常全面的吗?

Is mfix for Maybe impossible to be nontrivially total?

由于 Nothing >>= f = Nothing 对应每个 f,以下简单的定义适用于 mfix

mfix _ = Nothing

但这并没有什么实际用处,所以我们有以下非完全定义:

mfix f = let a = f (unJust a) in a where
    unJust (Just x) = x
    unJust Nothing = errorWithoutStackTrace "mfix Maybe: Nothing" 

如果 mfix f 返回 Nothing 如果此 let 子句不会停止,那就太好了。 (例如,f = Just . (1+)
这是不可能的,因为停机问题无法解决吗?

其中一条MonadFix定律说,当单子动作是纯的时,单子不动点必须与纯不动点重合:

mfix (return . f) = return (fix f)

因此,需要以下内容:

mfix (Just . (1+)) = mfix (return . (1+))
                   = return (fix (1+))
                   = Just (fix (1+))

fix (1+)确实是底部。因此,对于您提出的功能,法律明确规定了 mfix 必须如何表现(它确实以这种方式表现)。

独立于实例是否守法,我们可以询问我们是否喜欢这些法律,或者是否有 另一个 功能,具有不同的名称是否有用和不同的法律,按照你的建议行事;例如特别是这两个调用应该像这样:

mfix' (Just . (1+)) = Nothing
mfix' (Just . const 1) = Just 1

由于您所说的原因,这是不可能实现的:停止问题告诉我们无法确定 fix f 是否会循环或完成任意 f。我们可以通过多种方式来逼近这个函数,但在这方面最终都会达不到完美。