2016-03-24 3 views
3

Я пытаюсь найти монады в Haskell, но пока не зашел слишком далеко.Разница между конструктором типа и функцией возврата монады (в Haskell)

Я нашел https://en.wikibooks.org/wiki/Haskell/Understanding_monads#cite_note-1 и несколько других руководств/объяснений, но ни один из них не объясняет разницу между конструктором типа и функцией возврата.

Как я понял конструктор типа

  • строит монаду от заданного значения базового типа данных. Так что это обычный конструктор, как в Java, который строит из данного параметра новый экземпляр.
  • return Функция применяет конструктор типа по заданному значению базового типа данных и возвращает построенную монаду.

Итак, в чем смысл иметь две функции, выполняющие в основном то же самое?

EDIT Так, используя пример Может быть, монада, в

  • country = Just "China": (конструктор) создает монаду для значения «Китай».
  • return "China": возвращает монаду, соответствующую стоимости Китая, поэтому в основном это монада, содержащая значение "China".

Вообще говоря, я понимаю монаду как контейнер ценностей. Одно использование монад - объединение простых/существующих вычислений в более сложные вычисления.

+0

Я боюсь, что это на самом деле не понимаю, что вы пытаетесь спросить и несколько вещей, которые я понимаю, кажется мне неправильным ... может вы вероятно, сделать это немного более конкретным? Давайте поговорим о 'Maybe'-monad, чтобы сделать это простым:' Maybe' - это конструктор типа, 'return = Just', поэтому можете ли вы перефразировать свой вопрос, используя это? – Carsten

+0

btw: они никогда не будут делать то же самое - вы можете просмотреть конструктор типа как функцию, но это функция на уровне уровня - 'return' будет обертывать значение в монаду – Carsten

+1

. Я не знаю, согласен ли я с дубликат ... похоже, это другая проблема с уровнем понимания здесь – Carsten

ответ

6

Конструкторы типов - это функции уровня, возвращающие тип. Maybe - это конструктор типа, который принимает параметр одного типа и возвращает тип, например. Maybe String, Maybe Int и т. Д.

Конструкторы данных используются для создания значений определенного типа. Для некоторых типов Maybe a эти конструкторы Just и Nothing т.е.

data Maybe a = Just a | Nothing 

return функция создает монадическое значение от «обычного» значения, например,

return 1 :: Maybe Int 
return "s" :: [String] 

Таким образом, в определении класса Monad

class Monad m where 
    return :: a -> m a 

m является конструктором типа, например, (IO, Maybe, []), который используется для построения типов, а return - это функция, которая строит монадическое значение типа m a со значением типа a.

Для экземпляра монады Maybe, return строит значение Maybe a с точностью до i.e.

instance Monad Maybe where 
    return x = Just x 

так, если вы знаете, что вы имеете дело с Maybe это не имеет значения, которые вы используете. Однако return имеет более общий тип, поскольку его можно использовать для построения произвольного значения m a для некоторой монады m.

+0

Итак, если вы сравниваете страну и возвращаете «Китай» из вопроса, какая разница? Так как, возможно, страна монады должна содержать монадическую ценность. Но так результат возвращения «Китай». – Jonas

+0

@Jonas - 'Just' является конструктором,' Maybe' является конструктором типа. 'Just x' и' return x' - это одно и то же для 'Maybe', но' return' имеет более общий тип в том, что он применяется к любой монаде, поэтому вы можете использовать его в общих чертах. – Lee

+0

Таким образом, функция return просто создает экземпляр элемента, который содержит монада? (Только абстрактный способ создания экземпляров базового типа?) – Jonas

2

Конструктор типа создает тип из других типов. Это не функция и не имеет ничего общего со значениями.

В Haskell [] является конструктором типа. При применении к типу, например, Int, он делает другой тип [Int].

Кстати, в Java [] также является конструктором типов. Он может сделать новый тип Int[] из существующего типа Int.

Возможно, вы хотели спросить о конструкторах данных. Действительно, [] также является конструктором данных (отличным от конструктора типа, записанного []), и в определенных контекстах он эквивалентен return. Зачем нам тогда return? return работает для любой монады и может использоваться для написания общего монадического кода, который работает для любой монады. Это обобщение из [] и Just и Left и ...

+0

'return' /' pure' - это просто обобщения конструкторов значений. Это так просто. Это должен быть принятый ответ. – ftor

Смежные вопросы