Wie benutzt man fromInteger ohne implizites Vorspiel in Haskell?

8

Das folgende Programm erzeugt einen Fehler in ghci:

%Vor%

Nämlich:

  

fromInteger.hs: 17: 16:
     Keine Instanz für (Monoid Integer)
       aus dem Literal 1' at fromInteger.hs:17:16
Possible fix: add an instance declaration for (Monoid Integer)
In the pattern: 1
In the definition of
fromInteger ': fromInteger 1 = one

Wie kann ich es beheben, so dass 1 für Monoids in den Wert one konvertiert werden kann? Alle anderen Ganzzahlen können (oder sollten) Prelude.undefined ergeben, wenn sie auf (Monoid a) => fromInteger angewendet werden.

Bitte seien Sie sich bewusst, dass ich das Gegenteil eines Experten von Haskell bin, also bitte verzeihen Sie mir, falls die Antwort offensichtlich ist.

    
Marc 19.10.2010, 14:29
quelle

1 Antwort

7

Das Problem besteht darin, dass Sie (mit NoImplitPrelude) nur Ganzzahlliterale für Typen verwenden können, für die es eine fromInteger -Funktion im Bereich gibt.

Sie können also in Ihrem Code nur Ganzzahlliterale verwenden, um Instanzen von Monoid darzustellen, und da in Ihrem Code Integer keine Instanz von Monoid ist, können Sie das Literal 1 nicht zur Darstellung der Ganzzahl 1.

Um dies zu beheben, könnten Sie ein anderes Modul erstellen, das den Auftakt importiert und integerOne :: Integer = 1 definiert.

Sie könnten dann Ihre fromInteger Funktion wie folgt definieren:

%Vor%     
sepp2k 19.10.2010, 14:40
quelle

Tags und Links