Haskell gibt Rückschlüsse für Funktoren

8

In letzter Zeit habe ich mit Haskell herumgespielt und speziell mit dem ganzen Funktor-Konzept. Je mehr ich darin eintauche, desto mehr a-ha-Momente bekomme ich, und es kitzelt sicherlich meine Dopamin-Rezeptoren ein bisschen.

Das Problem, mit dem ich festhalte, ist das folgende. Hier ist der Code, der funktioniert, er hebt die Funktion auf und wendet sie dann zuerst auf den IO-Wert und dann auf eine Liste an.

%Vor%

Es ist sehr verlockend, es übersichtlicher zu schreiben, d. h .:

%Vor%

Ein Teil von mir sagt, dass es konzeptionell richtig ist, da replicator sowohl auf IO- als auch auf List-Instanzen anwendbar sein könnte, aber Haskell ist eine stark typisierte Sprache, die es mir nicht erlaubt. Ich denke, ich verstehe ziemlich gut, warum das passiert.

Die Frage ist: Gibt es eine Möglichkeit, der letzteren Variante näher zu kommen? Oder ist es in Ordnung, mit den ehemaligen zu leben?

Danke!

    
SkyWriter 19.08.2015, 05:24
quelle

1 Antwort

19

Ihr Code ist eigentlich in Ordnung, außer dass Sie in die gefürchtete Monomorphismus-Einschränkung , die Haskell von herleiten hielt den allgemeinsten möglichen Typ für replicator .

Im Wesentlichen wird Haskell mit der Einschränkung auf polymorphe Typen für Bindungen, die nicht wie Funktionen aussehen, nicht ableiten. Das heißt, es hat einen konkreten Funktor wie [] oder IO für replicate auszuwählen und verursacht einen Fehler, wenn Sie versuchen, es in zwei verschiedenen Kontexten zu verwenden.

Sie können Ihren Code auf drei Arten arbeiten lassen:

  • deaktivieren Sie die Monomorphie-Einschränkung: Fügen Sie {-# LANGUAGE NoMonomorphismRestriction #-} oben im Modul hinzu.

  • Machen Sie replicator sehen wie eine Funktion:

    %Vor%
  • Fügen Sie Ihrem Code explizite Typ-Signaturen hinzu

    %Vor%

Die dritte Option ist am idiomatischsten. Bei einem guten Haskell-Stil müssen Sie allen Ihren Bezeichnern auf oberster Ebene explizite Typ-Signaturen hinzufügen. Es ist jedoch hilfreich, die anderen beiden Optionen zu kennen, um zu verstehen, was vor sich geht, und um in Haskell schnell und einfach wegwerfbare Skripts schreiben zu können, ohne sich um Typensignaturen kümmern zu müssen.

    
Tikhon Jelvis 19.08.2015, 05:34
quelle