Ich hielt eine Präsentation über F # und diskutierte den Optionstyp, als mich jemand im Publikum fragte, ob der Optionstyp die Implementierung der Vielleicht-Monade durch F # ist. Ich weiß, dass dies nicht der Fall ist, aber ich wollte fragen, wie die beiden Konzepte zusammenhängen. Ich meine, es scheint mir, dass ein Optionstyp das Ergebnis der Operation einer vielleicht Monade sein könnte, aber ich bin mir nicht einmal sicher.
Würde jemand die Beziehung zwischen der vielleicht Monade und dem Optionstyp in den funktionalen Sprachen erläutern, die dies unterstützen?
functional-programming
monad
Onorio Catenacci
quelle
quelle
that's not the case
? Sie sehen mir sehr ähnlich.Antworten:
Wenn man die Dokumentation zum
Option
Typ von F # liest , sieht es so aus, als ob es sich ziemlich genau wie derMaybe
Typ in Haskell verhält , da es entweder 'nichts' (None
in F #,Nothing
in Haskell) oder einen Wert seines Argumenttyps (Some
in F #, ) modellieren kann.Just
in Haskell).In Haskell handelt es sich jedoch
Maybe
auch um eine Monade, und die Installation ist so, dass Berechnungen vonMaybe
Werten möglich sind und frühzeitig zurückgegeben werden,Nothing
wenn eine der Variablen in der Berechnung vorhanden istNothing
. Auf diese WeiseMaybe
wird ein einfacher Fehlerbehandler (oder besser gesagt ein Gerät, das Fehler ignoriert) verwendet, und die Tatsache, dass es sich um eine Monade handelt, ermöglicht es, die Kesselplatte aus dem Weg zu räumen. In diesem Wikipedia-Artikel finden Sie ein schönes, kurzes Beispiel. Ich glaube nicht, dassOption
diese Art der monadischen Verwendung unterstützt wird (tatsächlich frage ich mich, ob es überhaupt ein explizites Konzept einer Monade in F # gibt). Wenn Sie dieses Verhalten in .NET wünschen, würden Sie es vermutlichOption.Value
für alle Ihre Argumente verwenden und die gesamte Berechnung in einen Versuch / Fang einschließenNullReferenceException
.Obwohl
Option
es demMaybe
Typ ähnlich ist , entspricht es nicht derMaybe
Monade .quelle
Monad
typeclass.Maybe
ist ein einfacher alter Datentyp, der jedoch auch implementiert wirdMonad
, um dieses "spezielle" Verhalten bereitzustellen.map
undbind
Funktionen von F # verhalten sich identisch mit den Vielleichtfmap
undbind
Funktionen von Haskell . Sie sind beide Monaden und haben ein gleichwertiges monadisches Verhalten. Haskell hat nur eineMonad
Typklasse, mit der Sie Monaden manipulieren können, während sie in F # eher einem abstrakten "Designmuster" ähneln.Ja, sie sind in dem Sinne äquivalent, dass der
Option
Typ zusammen mitOption.bind
und derSome
Typkonstruktor eine Monade bilden.Während Monaden (wie in der
Monad
Typklasse) ein zentraler Bestandteil von Haskells Identität sind, sind sie aus konzeptioneller Sicht ein sprachunabhängiges Konstrukt. Ein Designmuster, wenn Sie möchten. Wenn Sie einen Typ haben und eine Bindungs- und eine Rückgabefunktion mit bestimmten Signaturen haben, die bestimmten Gesetzen entsprechen - Sie haben eine Monade -, unabhängig von der Sprache, die Sie verwenden.F # -Berechnungsausdrücke bieten nur einen programmierbaren Syntaxzucker für Monaden, ähnlich der do-Notation in Haskell. Obwohl kein
Option
Builder für Berechnungsausdrücke standardmäßig bereitgestellt wird, können Sie auf einfache Weise einen Bare-Bones wie diesen definieren:Und benutze es so:
Das ist ein gezuckertes Äquivalent von so etwas:
Beachten Sie, wie die Builder-Mitglieder die
Monad
Typklasse spiegeln und wie Sie monadischen - auch wenn verschlungenen - Code ohne Builder schreiben können.quelle
Sie sind gleichwertig und beide Monaden. Der Unterschied wird ein Monade Mittel etwas in Haskell - es gibt eine explizite
Monad
typeclass und „do - Notation“ verwendet wird , kann eine Menge von vorformulierten zu beseitigen , wenn monadischen Code zu schreiben. In F # kann die Builder-Notation undlet!
unddo!
verwendet werden, um ähnliche Boilerplates zu entfernen, aber es gibt keine explizite Vorstellung von einem Typ "eine Monade sein". DasMonad
Typensystem von Haskell umfasst Typklassen (von denen die allgemeine Klasse ist) und höher sortierte Typen (von denen eine PersonMonad
ist), die das Schreiben von Code ermöglichen, der für alle Monaden funktioniert. Das Typensystem von F # verfügt über keine dieser Funktionen.Also ja, F #
Option
und HaskellMaybe
sind identisch und beide Monaden. Es ist nur so, dass Haskell Ihnen viel mehr Maschinen zum Arbeiten mit Monaden bietet als F #.quelle