2014-01-04 2 views
3

В Haskell, определение класса Monad выглядит следующим образом:Класса монад в Дарте

class Monad m where 
    (>>=) :: m a -> (a -> m b) -> m b 
    (>>) :: m a -> m b -> m b 
    return :: a -> m a 
    fail :: String -> m a 

Я хочу выразить в Dart, что m в приведенном выше Haskell коды говорит: каждый Monad класса должен имеют методы, выполняющие вычисления на объектах одной монады. Является ли это возможным? Как?

+0

Вы думаете, что DART является функциональным языком программирования? Знаете ли вы примеры на других языках? Я думаю, что если существует пример на другом языке (не функциональный), его можно легко адаптировать к Дарту, чем прямая аналогия с примером Хаскелла (из Википедии). – mezoni

+0

Я не думаю, что у Дарта есть интерфейсы (или подобные), которые допускают этот тип выразительного ограничения; вы можете выполнить эту же вещь, но определенно не в такой же выразительной манере. –

ответ

2

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)); 
} 
Смежные вопросы