Future
является монадическим, поэтому вы можете посмотреть, как это делается в Дарте. Первое, что нужно отметить, это то, что система типа Дарта не в состоянии полностью набирать все операции, но они по-прежнему работают в основном одинаково. (>>=
).
Если Dart имели общие методы и типы союзов, будущее интерфейс может выглядеть следующим образом:
Future<A> {
Future<B> then<B>(Future<B>|B callback(A value));
}
(Примечание: это не реальная Dart)
then()
принимает функцию обратного вызова, которая принимает A
и возвращает либо Future<B>
, либо B
. Если обратный вызов возвращает B
, он автоматически преобразуется в Future<B>
.
Эквивалент >>
состоит в том, чтобы просто игнорировать параметр обратного вызова.
Если вы не делаете автоматическое преобразование монады, вы можете получить немного лучше печатать, но из-за отсутствия общих методов вы не можете быть такими точными, как в Haskell. Вы можете написать следующее:
class Monad<A> {
Monad/**<B>**/ bind(Monad/**<B>**/ callback(A value));
}
Вы думаете, что DART является функциональным языком программирования? Знаете ли вы примеры на других языках? Я думаю, что если существует пример на другом языке (не функциональный), его можно легко адаптировать к Дарту, чем прямая аналогия с примером Хаскелла (из Википедии). – mezoni
Я не думаю, что у Дарта есть интерфейсы (или подобные), которые допускают этот тип выразительного ограничения; вы можете выполнить эту же вещь, но определенно не в такой же выразительной манере. –