Ich bin neu in Haskell und ich versuche, einfache Funktionen zu schreiben, um mich an die Syntax zu gewöhnen, ich möchte meine eigene Funktion zum Hinzufügen eines bestimmten Elements zu einer Liste an einem bestimmten Index schreiben. Hier ist, was ich in Atom (mein Texteditor) schrieb:Wie man Wächter in Haskell richtig benutzt?
addElem :: a->[a]->Int->[a]
addElem elem list index
| index <= 0 = elem:list
| index < (length list) = a ++ (elem:b) where a = take index list; b = drop index list
| otherwise = list
Die Idee ist, dass es nicht so lange wird ausflippen als Index ist ein Int
und elem
ist vom gleichen Typ wie die Elemente von list
, aber wenn ich versuche, das in ghci zu laden, bekomme ich "parse error on` | '". Muss ich die Arten der Argumente einschränken? Ich lese, Lerne Du ein Haskell, aber ich bin nicht zu dem Teil gekommen, wo sie vollständig erklären, wie die Einrückungen funktionieren, also könnte mein Fehler auch da sein.
Ein 'Where'-Block ist nicht an einen Ausdruck gebunden, d. H.' X, wobei decls' kein Ausdruck ist (im Gegensatz zu 'let decls in x', was ein Ausdruck ist). Ein 'where'-Block muss an eine Deklaration angehängt werden, in diesem Fall möchten Sie ihn vermutlich an die 'addElem'-Deklaration angehängt haben und müssen also * nach * dem Deklaration-Body platziert werden, zu dem auch die letzte Guard-Anweisung gehört. Beachten Sie, dass Parsing-Fehler niemals mit der Verwendung des falschen Typs zu tun haben - es bedeutet, dass der Compiler Ihren Code nicht einmal versteht, geschweige denn, ihn als falsch zu beurteilen. Dies ist auch kein Einrückungsfehler. – user2407038
@ user2407038 das sollte eine Antwort sein – jberryman
Willst du wirklich 'elem' ignorieren, wenn' index' zu groß ist? Das ist ein bisschen asymmetrisch im Vergleich zum Voranstellen des Elements, wenn 'index' <0 ist. Ich würde denken, dass 'sonst = Liste ++ [elem]' Sinn machen würde. – chepner