Ich habe diesen Code im unm hip Paket gefunden. Also Pixel ist eine Funktion?Was bedeutet der Stern in diesem Haskell Code?
Antwort
Als Erweiterung zu Standard Haskell können Sie mit "Arten" umgehen. Arten sind ein sehr einfaches Typsystem für Typen und Typkonstruktoren. Art *
ist ein einfacher Typ, wie Int
. Kind * -> *
ist ein Typkonstruktor, der einen Typ annimmt und einen Typ ergibt, wie Maybe
: übergeben Sie einen Typ wie Int
als ein Argument, und Sie erhalten den Typ Maybe Int
.
Die andere Erweiterung in diesem Code (die ich nicht bemerkt habe, seit der Einzug verloren wurde) ist Typen zugeordnet. Eine Typklasse in Standard-Haskell kann eine Reihe von Funktionen angeben, die der Typ unterstützen muss. Bei zugeordneten Typen können zusätzlich Typen und Typkonstruktoren angegeben werden, die dem Typ zugeordnet sind.
Hier bedeutet dies, dass ein Typ i
, die eine Instanz von Imageable
ist (d.h. wie ein Bild verhält) Pixel i
einen zugehörigen Pixeltyp aufweisen müssen, und dies muss eine einfache Art (Art *
), nicht einen Typkonstruktor.
"Also Pixel ist eine Funktion?"
Pixel ist eine Typ-Level-Funktion. Es benötigt einen einzelnen Typ (der eine Instanz von Imageable sein muss) und gibt einen Typ vom Typ '*' zurück. Aufgrund seiner Verwendung im Beispielcode muss der Eingabetyp ebenfalls vom Typ '*' sein. Also, Pixel ist sehr ähnlich zu Maybe, sie sind beide "Typkonstruktoren" der Art "* -> *", Sie geben ihnen einen "einfachen Typ" und sie geben einen "einfachen Typ" zurück. Sie gelten auch an den gleichen Orten. Genauso wie Sie keine Funktion vom Typ 'Foo -> Maybe' haben können, können Sie auch keine Funktion vom Typ 'Bar -> Pixel' haben.
Also das 'type' Schlüsselwort ist nicht wie bei einem Haskell Type Synonyms Schlüsselwort richtig? Wenn es so ist, wie du gesagt hast, warum ist es nicht so geschrieben: 'type Pixel :: i -> *' – osager
@osager Es ist verwandt, aber nicht dasselbe. Wenn Sie eine Instanz (Imagable my_image) bereitstellen, muss Ihre Definition für Pixel ein vorhandener Typ sein und (Pixel my_image) ist ein Alias / Synonym für diesen Typ. Es handelt sich um eine GHC-Erweiterung, die als (offene) Familien bezeichnet wird. –
- 1. Was bedeutet "ID" in diesem Haskell-Code?
- 2. Was bedeutet * (Stern) in Ruby?
- 3. Was bedeutet ENDOFTEXT in diesem Perl-Code?
- 4. Was bedeutet! Type in diesem Code?
- 5. Python3: Was bedeutet "%" in diesem Code?
- 6. Was bedeutet "Shift: =" in diesem VB6-Code?
- 7. Generator-Funktion - Was bedeutet der Stern auf =?
- 8. was bedeutet der Stern einer URL
- 9. Was bedeutet "~" in Haskell?
- 10. Was bedeutet() in Haskell
- 11. Was bedeutet "@" in Haskell?
- 12. Was bedeutet (function() bedeutet in diesem speziellen Code-Segment
- 13. Was bedeutet ": .." in Haskell?
- 14. Was bedeutet (== "") in Haskell?
- 15. Was bedeutet der Unterstrich in diesem Fall?
- 16. Was bedeutet Apostroph in Haskell?
- 17. Was bedeutet der _ Parameter in diesem Zusammenhang?
- 18. Was bedeutet der Operator/= in Haskell?
- 19. Was bedeutet "&" in diesem Fall?
- 20. Was bedeutet der Stern auf der Thread-ID?
- 21. Was bedeutet (&) - kaufmännisches Und in Klammern - in diesem Code?
- 22. Was bedeutet "!!" gemein in haskell?
- 23. Was bedeutet ein Stern vor der CSS-Hintergrundfarbe?
- 24. Was bedeutet ~> (Tilde größer als) in diesem Swift-Code?
- 25. Was bedeutet der Haskell-Operator "<>"?
- 26. Was bedeutet ein Stern in einem scanf-Formatbezeichner?
- 27. Was bedeutet der Code-Parameter in EXC_BAD_ACCESS?
- 28. Was bedeutet -2 in diesem IL-Befehl?
- 29. Was bedeutet `{0: X2}` in diesem Codebeispiel?
- 30. Was bedeutet der folgende Code?
Wissen Sie, warum der Codeautor dieses Design verwendet? – osager
Es gibt nicht viel Auswahl. Sie haben eine Art von Typ, die ein Bild darstellt, und die Typklasse benötigt Funktionen, die sich mit einem einzelnen Pixel im Bild befassen. Sie müssen einen Weg finden, um herauszufinden, welcher Typ dieses Pixel ist. Du könntest es reparieren, aber das ist nicht sehr flexibel. Sie könnten Imageable zu einer Multi-Param-Klasse über dem Bild und dessen Pixel machen, aber dann brauchen Sie funktionale Abhängigkeiten oder Typ-Ambiguitäten werden Sie verrückt machen, und Sie müssen immer noch den Pixel-Typ in jeder Signatur erwähnen, die die Klasse verwendet. Zugehörige Typen sind viel sauberer und einfacher. –