Должен Язык который Монады Реализаций быть Со статическим контролем типов?

15
задан Keith Pinson 27 July 2015 в 13:45
поделиться

4 ответа

Существует много реализаций монад на динамически типизированных языках:

В целом, Церковный Тезис Тьюринга говорит нам, что все, что может быть сделано в [1 124] один язык, может также быть сделано в [1 125] любой язык.

, Как можно, вероятно, сказать от выбора примеров выше, я - (главным образом) Ruby программист. Так, так же, как шутка я взял один из примеров выше и повторно реализовал его на языке, о котором я знаю абсолютно ничто , который обычно считается не очень мощным языком, и это, кажется, единственный язык программирования на планете, для которой я не смог найти учебное руководство по Монаде. Позвольте мне представить Вам … Монада Идентификационных данных в PHP:

<?php
class Identity {
  protected $val;
  public function __construct($val) { $this->val = $val; }
  public static function m_return($a) { return new Identity($a); }
  public static function m_bind($id_a, $f) { return $f($id_a->val); }
}

var_dump(Identity::m_bind(
  Identity::m_return(1), function ($x) {
    return Identity::m_return($x+1);
  }
));
?>

Никакие статические типы, никакие дженерики, никакие необходимые закрытия.

Теперь, если Вы на самом деле хотите статически проверить монады, затем Вам нужна статическая система типов. Но это - более или менее тавтология: если Вы хотите статически проверить типы, Вам нужно статическое средство проверки типа. Понятное дело.

Относительно Вашего вопроса:

В моем понимании, монада реализации языка должна быть проверена в типе статически. Иначе введите ошибки, не может быть найден во время компиляции, и "Сложностью" не управляют. Мое понимание корректно?

Вы правы, но это не имеет никакого отношения к монадам. Это - примерно статический тип, проверяющий в целом, и применяется одинаково хорошо к массивам, спискам или даже простым скучным целым числам.

здесь существует также отвлекающий маневр: если Вы смотрите, например, на реализации монады в C#, Java или C, они намного длиннее и намного более сложны, чем, скажем, пример PHP выше. В частности, существует тонны из типов везде, таким образом, это, конечно взгляды впечатляющие. Но ужасная истина: C#, Java и системы типов C не достаточно на самом деле мощны для выражения типа Monad. В частности, Monad разряд 2 полиморфных типа, но C# и Java только поддерживают разряд 1 полиморфизм (они называют его "дженериками", но это - то же самое), и C не поддерживает даже это.

Так, монады на самом деле не статически зарегистрированы типом C#, Java и C. (Это - например, причина, почему понимания монады LINQ определяются как шаблон и не как тип: потому что Вы просто не можете экспресс тип в C#.) Вся статическая система типов делает, делают реализацию намного более сложной, без фактической помощи. Это требует намного более сложной системы типов, такой как Haskell, для получения фактической безопасности типов для монад.

Примечание: что я записал выше только [1 131] относятся к дженерику monad сам тип, как указывает @Porges. Можно, конечно, выразить тип любого конкретный монада, как List или Maybe, но Вы не можете выразить типа Monad самого. И это означает, что Вы не можете проверка типа то, что" List ISA Monad", и Вы не можете проверка типа универсальные операции, которые работают над всеми экземплярами Monad.

(Отмечают, что, проверяя, что Monad также повинуется монаде законы в дополнение к приспосабливанию монаде , тип , вероятно, слишком много даже для системы типов Haskell. Вам, вероятно, были бы нужны зависимые типы и возможно даже полноценная автоматическая программа автоматического доказательства теоремы для этого.)

26
ответ дан 1 December 2019 в 03:15
поделиться

Конечно, не случай язык, реализовывая монады должен быть со статическим контролем типов, как просит Ваш заголовок вопроса. Это может быть хорошая идея по причинам, которые Вы обрисовываете в общих чертах, но ошибки, не удающиеся быть обнаруженными во время компиляции, никогда не останавливали никого. Только посмотрите, сколько люди пишут PHP.

0
ответ дан 1 December 2019 в 03:15
поделиться

Нет, в php невозможно реализовать монады. Для этого нужны замыкания. Тем не менее, концепция Maybe может быть полезной, когда вы моделируете сопоставление шаблонов с классами:

abstract class Maybe {
        abstract public function isJust();
        public function isNothing(){
                return !$this->isJust();
        }
}

class Just extends Maybe {
        protected $val = null;
        public function __construct($val){
                $this->val = $val;

        }
        public function isJust(){
                return true;
        }
        public function getVal(){
                return $this->val;
        }

}
class Nothing extends Maybe {
        protected $val = null;
        public function __construct(){

        }
        public function isJust(){
                return false;
        }
}

function just(){
        print "isJust";
}
function nothing(){
        print "nothing";
}
function MaybeFunc(Maybe $arg){
        if(get_class($arg) == 'Just'){
                print "Just";
        } else {
                print "Nothing";
        }
}

MaybeFunc(new Just(5));
MaybeFunc(new Nothing());
-3
ответ дан 1 December 2019 в 03:15
поделиться

Вам нужны закрытия для монады State. Я проверил, в PHP есть замыкания, начиная с версии 5.3. Так что это больше не будет проблемой.

0
ответ дан 1 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: