2015-10-13 25 views
8

In einigen Haskell Code stieß ich auf:Was bedeutet() in Haskell

put :: s -> m() 

Was bedeutet das () hier?

Ich würde eine Suchmaschine verwenden, aber ich kann keine finden, die () korrekt behandelt.

+0

Mögliches Duplikat von [() in Funktionsvariable und Anwendung] (http://stackoverflow.com/questions/29970012/in-function-variable-and-application) – rightfold

+0

@Elyse, ich sehe diese Frage nicht als ein ideales dup-ziel. Es ist ein bisschen durcheinander. – dfeuer

Antwort

13

nicht für die seltsame spezielle Syntax Wenn, könnte es als

data() =() 

dort Es geht um die langweiligste Art ist definiert werden. Die Syntax soll Sie an Tupel denken lassen: ist ein Paar, (a,b,c) ist ein Triple, usw., und () ist ein 0-Tupel. Das einzige, was fehlt, ist ein 1-Tupel, das diese Syntax nicht haben kann, weil es mit der üblichen Verwendung von Klammern kollidieren würde.

() wird sehr oft als Ergebnis von etwas verwendet, das kein interessantes Ergebnis hat. Zum Beispiel wird eine IO Aktion, die einige E/A durchführen und beenden soll, ohne ein Ergebnis zu erzeugen, typischerweise den Typ IO() haben. Es kann auch verwendet werden, wenn Sie uninteressante Eingaben benötigen. GHC hat spezielle Syntax für diese, aber in Haskell 98 die Art und Weise Lisp des cond wie dies zu imitieren:

case() of 
() | c1 -> e1 
    | c2 -> e2 
    ... 
    | otherwise -> e3 

Es ist völlig in Ordnung, aber auch vollkommen langweilig, zu fragen, was Wert vom Typ () Sie haben; es gibt nur einen legitimen, den du haben könntest.

Vom Standpunkt der "Haskell-as-fast-category" ist () ein endgültiges Objekt. Das heißt, für jeden Typ X gibt es genau eine legitime Funktion des Typs X ->(), nämlich const(). Aus der anderen Richtung erwähnt der Schweinemast-Typ Void ein Anfangsobjekt. Für jeden Typ X gibt es genau eine legitime Funktion des Typs Void -> X, nämlich absurd. Wenn Sie in der Stimmung für kategorisches Denken sind, können Anfangs- und Endobjekte nützlich sein, um herum zu haben.

3

Es heißt "unit type". Sie können es in einigen Punkten als Haskell-Äquivalent von void vorstellen. Es ist ein Typ, der nur einen Wert hat (auch ()).

+2

FTR, es ist Haskells Pendant zu _was C-ähnliche Sprachen 'void' _... nennen, außer dass es in diesen Sprachen überhaupt kein Typ ist. Auch "void" ein bisschen eine falsche Bezeichnung, da der Einheitentyp tatsächlich nicht leer ist. Haskell hat auch einen ['Void'-Typ] (http://hackage.haskell.org/package/base-4.8.1.0/docs/Data-Void.html), der wirklich leer ist (und das bedeutet, dass er sich sehr verhält) anders als '()' oder C-style 'void'). – leftaroundabout

+3

Die ganze "Leere" in Haskell gegen 'void' in C und'() 'in Agda gegen'() 'in Haskell macht mich traurig. Als ich in Haskell den Typ vorgeschlagen habe, der jetzt 'Void' ist, habe ich ihn' Zero' genannt, was mehr evokativ ist, wenn man nur seine (nicht-unteren) Einwohner zählt. Ich bin (angenehm) überrascht, dass es überhaupt in der Bibliothek ist. Es war ein praktischer Witz, mit dem ich meine, ich habe es als einen Witz vorgeschlagen, aber es ist auch praktisch. – pigworker

+2

@pigworker: vielleicht deine praktischen Witze [muss etwas weniger subtil sein] (https://xkcd.com/516/) ... - Ich stimme zu, dass 'Zero' für den allgemeinen Programmierer wahrscheinlich ein weniger verwirrender Name wäre Bevölkerung, aber wenn es nicht für C wäre, wäre der 'Void' Name völlig in Ordnung. Was wirklich gut ist, ist natürlich, wenn Haskell die freien ADT-Typen konsequent nennt - insbesondere sollte "Entweder" immer "+" gewesen sein! – leftaroundabout

4

Es gibt ausgezeichnete Suchmaschinen spezialisiert auf Haskell.

http://hayoo.fh-wedel.de/?query=() werden Sie sofort die richtige Antwort:

Data()
ghc-prim -GHC.Tuple


Die Einheit Datentyp () hat ein nicht-undefiniert Mitglied, den nullary Konstruktor ().

28

() bedeutet "Bohren". Es bedeutet den langweiligen Typ, der eine Sache enthält, auch langweilig.Es ist nichts Interessantes zu gewinnen, wenn man ein Element des langweiligen Typs mit einem anderen vergleicht, denn man kann nichts über ein Element des langweiligen Typs lernen, wenn man es auf sich aufmerksam macht.

Es ist sehr verschieden von der leeren Art, genannt (von Menschen, die ich wünschte, hatte einen besseren Namen wie die, die ich vorgeschlagen) in Haskell Void. Der leere Typ ist sehr aufregend, denn wenn jemand Ihnen jemals einen Wert gibt, der Ihnen gehört, wissen Sie, dass Sie bereits tot und im Himmel sind und dass alles, was Sie wollen, Ihr ist.

Aber wenn jemand Ihnen einen Wert in () gibt, nicht aufgeregt werden. Wirf es einfach weg.

Manchmal macht es Spaß, Typenkonstruktoren zu parametrieren, die durch einen "Elementtyp" parametrisiert sind, und den Parameter mit () zu füllen. Sie können sehen, welche Informationen dem Typkonstruktor inhärent sind und nicht von den Elementen kommen. Beispielsweise ist Maybe() eine Version von Bool mit Just() oder Nothing. Auch [()] entspricht den (möglicherweise unendlichen) natürlichen Zahlen: die einzige Information, die Sie haben, ist eine Länge.

Also, () bedeutet "langweilig", aber es ist oft ein Hinweis, dass etwas anderes woanders passiert.

+3

Was war dein Vorschlag? "Falsch"? "Initial"? 'Lächerlich'? – dfeuer

+1

Darf ich vorschlagen "starb in einer Explosion und in den Himmel"? – dfeuer

+3

Die einzige Stelle, an der '()' 'Beruhigend' statt 'Langweilig' ist, wäre ['rnf'] (https://hackage.haskell.org/package/deepseq-1.4.1.2/docs/Control-DeepSeq. html # v: rnf). –