mfix for也许不可能总之不小?

时间:2018-07-13 11:29:34

标签: haskell monads fixed-point maybe halting-problem

由于每个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
因为停止问题无法解决,这是否不可能?

1 个答案:

答案 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循环或结束。我们可以通过多种方式来逼近此函数,但在这方面,最终所有人都将不尽人意。