2017-12-31 101 views
2

In Haskell,Typ konnte nicht ‚Integer -> t‘ erwartet übereinstimmen mit den tatsächlichen Typ ‚Bool‘

Das perfekt funktioniert gut: (mod 9) 7. Es ergibt das erwartete Ergebnis: Rest, wenn 9 durch 7 geteilt wird().

Ähnlich funktioniert das auch: (mod 9) 9. Es gibt zurück.

Dies führte mich zu der Annahme, (mod 9 == 0) 9 sollte True zurückgeben. Dies war jedoch nicht der Fall: Stattdessen wurde ein Fehler angezeigt.

den Fehler:

<interactive>:62:1: error: 
    • Couldn't match expected type ‘Integer -> t’ 
        with actual type ‘Bool’ 
    • The function ‘mod 9 == 0’ is applied to one argument, 
     but its type ‘Bool’ has none 
     In the expression: (mod 9 == 0) 9 
     In an equation for ‘it’: it = (mod 9 == 0) 9 
    • Relevant bindings include it :: t (bound at <interactive>:62:1) 

Bitte helfen Sie mir zu verstehen, warum (mod 9 == 0) 9 nicht True zurückkehren würde.

P.S .: Ich bin überzeugt, dass meine Verwendung von "Return" in Haskells Kontext fehlerhaft ist. Wie auch immer, ich fange gerade erst an, also bitte entschuldige mich. (Wäre schön, wenn Sie mich korrigieren könnte, wenn ich bin, ja falsch.)

+1

Warum sollte es? 'mod 9 :: Integral a => a -> a', während' 0 :: Num a => a'. – chepner

+1

Sie scheinen zu versuchen, '==' und 'mod 9' zu komponieren, was wie folgt aussehen würde: ((== 0). (Mod 9)) 9 '. – chepner

+0

Verstanden! Ich fühle mich jetzt dumm. Auf der anderen Seite scheint Haskells Typsystem so nützlich zu sein, um Code zu verstehen. Vielen Dank. Soll ich diese Frage löschen? – spideyonthego

Antwort

7

Wie ich in einem Kommentar erwähnt, scheint es, dass Sie mod 9 == 0 erwarten eine Funktion zu sein, die ein Argument nimmt, übergibt sie an mod 9, dann gibt das Ergebnis des Vergleichs zurück. Sie können einen solchen Ausdruck schreiben, aber es ist ein wenig komplizierter.

>>> ((== 0) . (mod 9)) 9 
True 

Hier (== 0) . (mod 9) ist die Zusammensetzung von zwei Funktionen, (== 0) und mod 9. Die zusammengesetzte Funktion nimmt ihr Argument, wendet mod 9 darauf an und wendet dann (== 0) auf das Ergebnis an. (Wo (== 0) ist eine Kurzform für \x -> x == 0.)

Verwandte Themen