2017-02-23 3 views
2

Ich bin ein kompletter Neuling in Haskell und habe folgende Frage: Ich beabsichtige, die Funktion zu erstellen, die drei Strings auf verschiedenen Zeilen setzt. Hier ist der Code:Neue Zeile Einrückung Haskell

onThreeLines :: String -> String -> String -> String 
onThreeLines a b c = a++"\n"++b++"\n"++c 

Hier ist, was ich laufen:

onThreeLines "Life" "is" "wonderful" 

Und was ich bekommen:

"Life\nis\nwonderful" 

Ich habe auch die folgenden Charakter versucht, aber es funktioniert nicht arbeite auch.

"'\n'" 

Antwort

4

Ihre Funktion funktioniert. Wenn Sie das in GHCi ausführen oder print verwenden, können Sie durch die Tatsache verwirrt sein, dass es show auf das Ergebnis Ihrer Berechnung aufruft, die einen Wert als Haskell-Begriff für das Debuggen formatiert. Für Strings bedeutet das, dass auch Anführungszeichen und Escapezeichen enthalten sind.

putStrLn (onThreeLines "Life" "is" "wonderful") sollte genau das tun, was Sie erwarten.

4

es wie folgt durchführen sollte es funktioniert:

main :: IO() 
main = putStrLn $ onThreeLines "hello" "world" "test" 

Ausführen des Programms, die ich erhalten:

$ ./test.hs 
hello 
world 
test 

Der Grund, warum Sie "Life\nis\nwonderful" bekommen ist, weil die Show Beispiel für die Anzeige verwendet wird was wird der Newline entkommen.

λ> putStrLn "hello\nworld" 
hello 
world 
λ> print "hello\nworld" 
"hello\nworld" 

Beachten Sie, dass print verwendet die Show Instanz für die Anzeige.

2

Es ist nichts falsch mit Ihrer Funktion. "Life \ nis \ nwonderful" ist der resultierende String, den Sie möchten. Denken Sie daran, dass, wenn Sie die Zeilenumbrüche richtig gemacht wollen, übergeben sie an eine Funktion wie putStrLn

putStrLn (onThreeLines "Life" "is" "wonderful") 

auch sicher, dass die unlines Funktion, die eine Liste von Strings verkettet zu überprüfen, jedes Element mit einem Newline-Zeichen zu trennen.