Один из 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
. Мы можем аппроксимировать эту функцию различными способами, но в конечном итоге все они будут далеки от совершенства в этом отношении.
person
Daniel Wagner
schedule
13.07.2018
mfix
не является полным вMaybeT
, хотя этот вопрос фокусируется на (недостижимом) вызове ошибки, а не на бесконечные циклы. - person Daniel Wagner   schedule 13.07.2018