Существует множество реализаций монад в динамически типизированных языках:
- Монада Maybe в Ruby
- OO Monads и Ruby (сайт недоступен, но статья доступен в Wayback Machine Интернет-архива)
- Монады в Ruby, часть 1: идентификация, Монады в Ruby, часть 1.5: Личность, Монады в Ruby, часть 2: возможно (опять же, возможно, нет)
- Монады в Ruby
- Монады по дешевке I: Возможно, Monad в JavaScript, Больше монад по дешевке: встроено fromMaybe
- Монады в Ruby (с красивым синтаксисом!), Список монад в Ruby и Python
- Донотация монад в стиле Haskell для Ruby
В общем, Тезис Черча-Тьюринга говорит нам, что все, что можно сделать на одном языке, можно сделать и на любом другом языке.
Как вы, наверное, поняли из приведенных выше примеров, я (в основном) программист на Ruby. Итак, просто в шутку я взял один из приведенных выше примеров и повторно реализовал его на языке, о котором я абсолютно ничего не знаю, который обычно считается не очень мощным языком, и который кажется, это единственный язык программирования на планете, для которого я не смог найти туториал по монадам. Позвольте представить вам… Identity Monad в 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. не может выразить тип в C#.) Все, что делает система статического типа, это делает реализацию намного сложнее, фактически не помогая. Требуется гораздо более сложная система типов, такая как Haskell, чтобы обеспечить реальную безопасность типов для монад.
Примечание: то, что я написал выше только, относится к самому универсальному типу monad
, как указывает @Porges. Конечно, вы можете указать тип любой конкретной монады, такой как List
или Maybe
, но вы не можете выразить тип самой Monad
. А это значит, что вы не можете проверить тип того факта, что List
ЯВЛЯЕТСЯ Monad
, и вы не можете проверить типовые операции, которые работают со всеми экземплярами Monad
.
(Обратите внимание, что проверка того, что Monad
также подчиняется законам монады в дополнение к соответствию монадному типу, вероятно, слишком сложна даже для системы типов Haskell. Вам, вероятно, понадобятся зависимые типы. и, возможно, даже полноценный автоматический доказатель теорем для этого.)
person
Jörg W Mittag
schedule
27.12.2008