2017-05-30 2 views
0

Ich bin neu in Haskell und mache ein paar einfache Übungen. Für diese Übung schreibe ich eine Funktion, die überprüft, ob eine Liste eine Untermenge einer anderen Liste mit Rekursion ist.Sehr einfacher Haskell-Code funktioniert nicht, "Variable nicht im Bereich"

Hier ist der Code:

subset [] xs = True 

subset (x:xs) ys = if elem x ys == False then False 
        else subset (tail xs) (delete x ys) 

ich die folgende Fehlermeldung erhalten:

C:\Functioneel programmeren\week4.hs:9:43: error: 
    Variable not in scope: delete :: t1 -> t t1 -> t t1 

Was bedeutet das auch?

Dieses Programm funktioniert nur, wenn ich "(delete x ys)" in "ys" ändere, aber dann tut es nicht, was es tun soll.

Jede Hilfe wäre großartig, danke im Voraus.

+2

Wo ist 'löschen' definiert? – Polygnome

+0

Ich hatte den Eindruck, dass das eine eingebaute Funktion in Haskell war: http://hackage.haskell.org/package/base-4.9.1.0/docs/Data-List.html#v:delete – Meurth

+0

Übrigens , Ihr 'if' kann in einer besser lesbaren Form als 'elem x ys && subset ...' umgeschrieben werden. Normalerweise neigen wir dazu, '== False' und' if..then False' in Haskell zu vermeiden. Auch 'tail xs' sieht falsch aus, bist du sicher, dass du' xs' nicht willst? – chi

Antwort

3

delete muss importiert werden. Nach https://www.haskell.org/hoogle/?hoogle=delete sollten Sie import Data.List an den Anfang hinzufügen.

Außerdem denke ich, Ihre Funktion subset ist falsch. Das Ergebnis von subset [1, 2, 1] [1, 2, 3] ist False.

+0

Danke, ich wusste nicht, dass ich es importieren musste. Ich denke, das Ergebnis davon sollte jedoch falsch sein, da es nur eine einzige 1 in der zweiten Liste in Ihrem Beispiel gibt. – Meurth

+0

Ich weiß nicht, was 'Untermenge' tun soll, also rate ich es einfach. Ich habe falsch geraten. – crvv

+1

@Meurth Ein Satz kann, mathematisch gesprochen, keine Duplikate enthalten. In diesem Fall wäre 'sublist' wahrscheinlich der bessere Name für Ihre Funktion, da Listen/Sequenzen Duplikate enthalten können. Aus mathematischer Sicht ist {1, 1, 1} gleich {1, 1} gleich {1}. – Polygnome

Verwandte Themen