2016-06-09 17 views
-3

In Haskell, versuche ich eine Methode, die eine Int zurückgibt, zu drucken. Für den Moment ist mySum nur ein Stub, weil ich versuche, herauszufinden, wie es gedruckt wird.Druck Funktion, die int

schaute ich auf, wie dies zu tun, und ich sah putStr ein String drucken kann und Show wandelt ein Int zu einem String so habe ich dies:

mySum :: [Int] -> Int 
mySum _ = 0 

main = putStr show mySum [1..5] 

Allerdings habe ich diese Fehler bin immer:

Couldn't match expected type ‘([Int] -> Int) -> [Integer] -> t’ 
       with actual type ‘IO()’ 
    Relevant bindings include main :: t (bound at weirdFold.hs:10:1) 
    The function ‘putStr’ is applied to three arguments, 
    but its type ‘String -> IO()’ has only one 
    In the expression: putStr show mySum [1 .. 5] 
    In an equation for ‘main’: main = putStr show mySum [1 .. 5] 

und

Couldn't match type ‘a0 -> String’ with ‘[Char]’ 
Expected type: String 
    Actual type: a0 -> String 
Probable cause: ‘show’ is applied to too few arguments 
In the first argument of ‘putStr’, namely ‘show’ 
In the expression: putStr show mySum [1 .. 5] 

Wie kann ich das Ergebnis der Methode tatsächlich ausdrucken?

+1

versuchen, einige Klammern hinzu: 'main = putstr (show (mySum [1..5]))'. Funktionsanwendung bleibt assoziativ. – user2297560

+0

Erster Eindruck des Titels: Sie versuchen, eine Funktion zu drucken (nicht den Wert, den Sie erhalten, wenn Sie die Funktion anwenden). Sie können leicht zu der Lösung gelangen, indem Sie erkennen, dass Sie einfach eine Int-Funktion drucken möchten. Wie 'print n' (' print = putStrLn. Show') und dann durch 'n' ersetzen:' print (mySum [1..5]) '. Ich habe 'print' zur Vereinfachung verwendet, aber Sie können' putStr. Show' oder irgendetwas anderes. – jakubdaniel

Antwort

13

Da die Funktionsanwendung linksassoziativ ist, wird putStr show mySum [1..5] implizit als ((putStr show) mySum) [1..5] geklammert. Es gibt ein paar Optionen; Einige sind unten aufgeführt.

  1. parenthesize ausdrücklich: putStr (show (mySum [1..5]))
  2. Verwenden Sie die rechts -associative Funktion Anwendung Betreiber $; ein Beispiel ist putStr $ show (mySum [1..5])
  3. Verwenden Zusammensetzung mit $: putStr . show . mySum $ [1..5]
  4. Verwenden Zusammensetzung mit Klammern: (putStr . show . mySum) [1..5]
+1

Das sind alles gute Ratschläge (Ich habe die Antwort upvoted), aber ich muss fragen, warum die Hybrid-Antwort für Nummer 2 .... Wenn Sie die '($)', warum nicht den ganzen Weg mit 'putStr $ show gehen $ meinSumme [1..5] '? – jamshidh

+0

Ich dachte 'putStr $ show $ mySum $ [1..5]' (obwohl die letzte wirklich unnötig ist) wäre zu viel neuer Operator auf einmal, so beschränkte ich mich darauf, es nur einmal zu verwenden, um einen Satz Klammern zu ersetzen . – chepner