由于每个Nothing >>= f = Nothing
的{{1}},下面的琐碎定义适用于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
)
因为停止问题无法解决,这是否不可能?
答案 0 :(得分:7)
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
循环或结束。我们可以通过多种方式来逼近此函数,但在这方面,最终所有人都将不尽人意。