2016-12-25 20 views
1

erwartet Partner I Lernen Haskell gerade erst begonnen, und ich bin auf unter einen Haufen von anderen auf diesem Fehler steckenHaskell konnte nicht Typ [char] mit tatsächlichen Typ IO

Ich versuche, alle Zeichen zu drucken in der Char-Liste rekursiv mit diesem Code

printall :: [Char] -> [Char] 
printall "" = "" 
printall (i:is) = if is /= "" then print i else printall is 

main = printall "hello world" 

aber ich bekomme diesen Fehler konnte mir jemand helfen?

intro.hs:14:36: error: 
• Couldn't match expected type ‘[Char]’ with actual type 
‘IO()’ 
• In the expression: print i 
    In the expression: if is /= "" then print i else printa 
ll is 
    In an equation for ‘printall’: 
     printall (i : is) = if is /= "" then print i else p 
rintall is 

intro.hs:16:1: error: 
• Couldn't match expected type ‘IO t0’ with actual type ‘ 
[Char]’ 
+1

rechtfertigen Bitte den Typ Signatur, die Sie 'printall' gab, oder vielleicht ist es einfach entfernen und sehen, was passiert. –

+0

@ n.m. Ich denke, die Typ-Signatur ist redundant, der gleiche Fehler bleibt ohne sie – SirTee

+3

Großartig, jetzt haben Sie diese "printall" "=" "'Zeile, und auch' printall (i: ist) 'Zeile. Letzterer hat "print i" im 'then'-Zweig und' printall is' im 'else'-Zweig. Die Typen der beiden Ausdrücke sollten gleich sein. Sind sie? –

Antwort

3

Wie Sie oben in einem Kommentar sagte, jeder Zweig der if-Klausel sollte die gleiche Art haben, in der Tat.

Außerdem muss main Funktion haben immer IO a Typ, für einige a, die in der Regel () ist. Dies bedeutet, dass die Art Signatur für printall sein sollte:

printall :: [Char] -> IO() 

, die die gleiche ist wie:

printall :: String -> IO() 
+3

'main' muss nicht' IO() 'sein. Es muss nur "IO t" für ein "t" sein. 'main = return 0' wird kompiliert. – Zeta

0

print Typ ist print :: Show a => a -> IO()

aber Ihre printall Typ ist printall :: [Char] -> [Char], davon ausgehen, es ist das, was Sie wollen.

Der Ausdruck if x then y else z müssen die gleiche Art für y und z

Verwandte Themen