Является ли mfix for Возможно невозможно быть нетривиально общим?

существует пара различий, которые я обнаружил после тестирования

1) return просто возвращает значение функции, чтобы использовать ее позже после ее сохранения в переменной, но echo просто распечатает значение по мере вызова функция и ничего не возвращает.

вот краткий пример этого

function myfunc() { echo "i am a born programmer"; }

$value = myfunc(); \\ it is going to print the 'i am a born programmer' as function would be called

if(empty($value)===true)  {
  echo "variable is empty because function returns nothing"; 

}

7
задан Dannyu NDos 13 July 2018 в 12:16
поделиться

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. Мы можем аппроксимировать эту функцию различными способами, но в конечном итоге все это не увенчается успехом.

7
ответ дан Daniel Wagner 17 August 2018 в 13:03
поделиться