2017-05-12 2 views
0

Ich versuche, eine Funktion in Haskell zu machen, um die Elemente einer Liste zu zeigen, und es funktioniert nicht. Was mache ich falsch?Haskell einfach zeigen die Elemente eines Listenprogramms

showw :: [Int a]=> [a] -> b 
showw []=0 
showw (x:xs)= x ++ showw xs 

Es gibt mir diese Fehlermeldung:

aplicatie.hs:1:12: error: 
• Expected a constraint, but ‘[Int a]’ has kind ‘*’ 
• In the type signature: afisare :: [Int a] => [a] -> b 
aplicatie.hs:1:13: error: 
• Expecting one fewer argument to ‘Int’ Expected kind ‘* -> *’, but 
    ‘Int’ has kind ‘*’ 
• In the type signature: afisare :: [Int a] => [a] -> b 
+1

Wie funktioniert es nicht? –

+0

Es gibt mir diesen Fehler: aplicatie.hs: 1: 12: Fehler: • Erwartet eine Einschränkung, aber '[Int a]' hat Art '*' • In der Typ Unterschrift: afisare :: [Int a ] => [a] -> b aplicatie.hs: 1: 13: error: • Erwartet ein weniger Argument zu 'Int' Erwarteter Typ '* -> *', aber 'Int' hat Art '*' • In der Typ-Signatur: afisare :: [Int a] => [a] -> b –

+0

Sie sollten das zur Frage hinzufügen. – Cirdec

Antwort

1

Es gibt ein paar Probleme hier.

Das erste Problem ist in der Typ-Signatur. Int ist ein Typ, aber Ihre Syntax lässt ihn wie eine Typklasse aussehen. Wenn Sie eine Funktion haben, die eine Liste von Ints nimmt und gibt einen anderen Wert, sollte es so aussehen:

func :: [Int] -> a 

Natürlich, das funktioniert nur, wenn Sie die Funktion Ints beschränken bedeuten. Wenn Sie andere Arten von Zahlen einschließen möchten, müssen Sie do eine Typklasse verwenden.Wenn Sie wollten Num verwenden, zum Beispiel würde die Art Signatur anstatt wie folgt aussehen:

func :: Num a => a -> b 

Aber auch wenn Sie reparieren Ihre Art Signatur Sie gehen noch einen Fehler zu bekommen, weil der Rückgabetyp des Funktion ist nicht konsistent. showw [] gibt 0 (ein Int) zurück, aber showw in einer nicht leeren Liste gibt eine Liste von Werten zurück. Sie möchten wahrscheinlich showw [] stattdessen [0] oder [] zurückgeben.

Und wenn Sie diese Werte in anzeigen möchten, wenn Sie sie in eine Zeichenfolge konvertieren, müssen Sie eine Funktion verwenden, um diese Konvertierung durchzuführen. Sie würden diese Funktion in der dritten Zeile auf x und auf den Rückgabewert showw [] anwenden.

+1

Nice ersten Satz, bro – luqui

+0

Großartige Köpfe, denke ich? –

1

Es gibt ein paar Probleme hier. Zuerst werden Einschränkungen in Klammern und nicht in Klammern geschrieben:

showw :: (Int a) => [a] -> b 

Das beseitigt einen Fehler.

Jetzt bin ich mir nicht sicher, was Sie beabsichtigen (Int a), aber Int ist keine Typklasse, so dass Sie es nicht so verwenden können. Vielleicht bedeutete Sie a ein Int ist, in diesem Fall werden wir nicht eine Variable vom Typ überhaupt und nur verwenden, um die Int Art an seiner Stelle verwenden würde:

showw :: [Int] -> b 

Jetzt gibt es diese b Umlauf allem durch seine einsamen und einsam Typvariablen sind generell ein Problem. Es sagt, dass showwjeder Art überhaupt zurückgeben kann, also, wenn ich sagte, hey, showw, hier ist [1,2,3,4,5], geben Sie mir eine Elephant es würde einen Elefanten zurückgeben müssen.

Da Sie die Liste auf „Show“ wollen, nehme ich Sie ein String

showw :: [Int] -> String 

zurückkehren wollen, die eine angemessene Signatur ist. Jetzt zur Implementierung:

show [] = 0 

Um eine leere Liste anzuzeigen, geben Sie ... 0? Das ergibt keinen Sinn. Wahrscheinlich möchten Sie die leere Zeichenfolge "".

Und dann diese Zeile:

showw (x:xs) = x ++ showw xs 

, in dem Sie versuchen, eine Int (x) mit einem String (showw xs) zu verketten, was nicht erlaubt ist. Sie müssen zuerst x in eine Zeichenfolge konvertieren, und ich denke, Sie sollten das mit der regulären show Funktion tun.

Das gesagt, die show Funktion kann bereits Listen anzeigen. Aber ich nehme an, du übst.

+0

Wie sollte das endgültige Programm aussehen? Sorry, aber ich bin neu in Haskell –

Verwandte Themen