2016-03-24 9 views
3

Ich versuche, Monaden in Haskell herauszufinden, bin aber noch nicht zu weit gekommen.Unterschied zwischen Typkonstruktor und Rückkehrfunktion einer Monade (in Haskell)

Ich fand https://en.wikibooks.org/wiki/Haskell/Understanding_monads#cite_note-1 und mehrere andere Tutorials/Erklärungen, aber keiner scheint den Unterschied zwischen dem Typkonstruktor und der Rückkehrfunktion zu erklären.

Wie ich verstand der

  • Typkonstruktor einen monadisch von einem gegebenen Wert des Basisdatentypen konstruiert. Es ist also ein normaler Konstruktor wie in Java, der aus dem gegebenen Parameter eine neue Instanz erstellt.
  • return Funktion wendet den Typenkonstruktor auf den angegebenen Wert des Basisdatentyps an und gibt die konstruierte Monade zurück.

Also, was ist der Sinn von zwei Funktionen im Grunde die gleiche?

EDIT So das Beispiel eines Maybe-Monade unter Verwendung der

  • country = Just "China": (Konstruktor) erstellt die Monade für den Wert "China".
  • return "China": gibt die Monade zurück, die dem Wert von China entspricht, also ist es im Grunde die Monade, die den Wert "China" enthält.

Allgemein verstehe ich eine Monade als ein Container für Werte. Eine Verwendung von Monaden besteht darin, einfache/existierende Berechnungen mit komplexeren Berechnungen zu kombinieren.

+0

Ich fürchte, es nicht wirklich verstehen, was Sie versuchen, scheint mir falsch zu fragen, und ich die wenigen Dinge verstand ... können Sie Machen Sie das vielleicht etwas konkreter? Lassen Sie uns über die 'Maybe'-Monade sprechen, um dies einfach zu machen -' Maybe' ist der Typkonstruktor, 'return = Just', also können Sie bitte Ihre Frage damit umformulieren? – Carsten

+0

BTW: diese werden nie das gleiche tun - Sie können den Typ-Konstruktor als eine Funktion anzeigen, aber es ist eine Funktion auf der Ebene des Typs - 'return' wird einen Wert in die Monade – Carsten

+1

wrap Ich weiß nicht, ob ich damit einverstanden bin das Duplikat ... es scheint ein anderes Problem mit dem Verständnis zu sein hier – Carsten

Antwort

6

Typkonstruktoren sind Funktionen auf Typenebene, die einen Typ zurückgeben. Maybe ist ein Typkonstruktor, der einen einzigen Typparameter verwendet und einen Typ, z. Maybe String, Maybe Int usw.

Datenkonstruktoren werden verwendet, um Werte eines bestimmten Typs zu erstellen. Für eine Art Maybe a Diese Konstruktoren sind Just und Nothing d.h.

data Maybe a = Just a | Nothing 

return Die Funktion erstellt einen monadischen Wert aus einer ‚Ebene‘ Wert z.B.

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

So in der Definition der Monad Klasse

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

m ist ein Typkonstruktor z.B. (IO, Maybe, []), die zum Konstruieren von Typen verwendet wird, während return eine Funktion ist, die einen monadischen Wert vom Typ m a aus einem Wert vom Typ a konstruiert.

Für die Monad-Instanz Maybe, return konstruiert einen Wert von Maybe a mit nur, d.h.

instance Monad Maybe where 
    return x = Just x 

so, wenn Sie wissen, dass Sie mit Maybe handelt es keine Rolle spielt, die Sie verwenden. Jedoch hat return einen allgemeineren Typ, da es verwendet werden kann, um einen beliebigen Wert m a für einige Monaden m zu konstruieren.

+0

Also, wenn Sie Land vergleichen und "China" von der Frage zurückgeben, was ist der Unterschied? Seit Maybe sollte ein Monad-Land einen monadischen Wert enthalten. Aber so ist das Ergebnis der Rückkehr "China". – Jonas

+0

@Jonas - 'Just' ist ein Konstruktor,' Maybe' ist der Typkonstruktor. 'Just x' und' return x' sind die gleichen für 'Maybe', aber' return' hat einen allgemeineren Typ, der für jede Monade gilt, so dass Sie sie generisch verwenden können. – Lee

+0

Also die Rückkehr-Funktion erstellt einfach eine Instanz der grundlegenden die Monade enthält? (Nur die abstrakte Art, die Instanzen des Basistyps zu erstellen?) – Jonas

2

Ein Typkonstruktor konstruiert einen Typ aus anderen Typen. Es ist keine Funktion und hat nichts mit Werten zu tun.

In Haskell ist [] ein Typkonstruktor. Wenn es auf einen Typ angewendet wird, sagen wir Int, macht es einen anderen Typ [Int].

Übrigens, in Java [] ist auch ein Typ Konstruktor. Es kann einen neuen Typ Int[] aus dem vorhandenen Typ Int machen.

Vielleicht wollten Sie nach Datenkonstruktoren fragen. In der Tat ist [] auch ein Datenkonstruktor (anders als der Typkonstruktor geschrieben []) und in bestimmten Zusammenhängen ist es äquivalent zu return. Warum brauchen wir dann return? return funktioniert für jede Monade und kann verwendet werden, um generischen monadischen Code zu schreiben, der für jede Monade funktioniert. Es ist eine Verallgemeinerung von [] und Just und Left und ...

+0

'return' /' pure' sind nur Verallgemeinerungen von Wertkonstruktoren. So einfach ist das. Dies sollte die akzeptierte Antwort sein. – ftor

Verwandte Themen