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
。我们可以通过多种方式来逼近这个函数,但在这方面最终都会达不到完美。
由于 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
。我们可以通过多种方式来逼近这个函数,但在这方面最终都会达不到完美。