2017-11-22 4 views
1
fsomaq = x 

x = sum (takeWhile (<x) [m | m <- [n*n | n <- [1..]]]) 

Was Im Versuch, hier zu tun ist erhält eine Grenze x und dann Quadrat jede Zahl und dann Summe all dieser erwartete Art `Int‘ Spiel.kann nicht mit dem tatsächlichen Typ [Int] Summe der quadratischen

Irgendeine Idee? Fehlermeldung:

Couldn't match expected type ‘Integer -> t’ with actual type ‘Integer’ • 

The function ‘fsomaq’ is applied to one argument, but its type ‘Integer’ has none In the expression: fsomaq 10 In an equation for ‘it’: it = fsomaq 10 • Relevant bindings include it :: t (bound at :16:1) 
+0

x = Summe (takeWhile ( Pedro

+0

Das macht nicht viel Sinn. Sie möchten die Summe der Elemente, die weniger als die Summe dieser Elemente sind ... –

+0

Entschuldigung Im neuen in dieser – Pedro

Antwort

2

Wenn ich es richtig verstehe, wollen Sie eine Funktion definieren, die eine Zahl als Eingabe und gibt die Summe der Quadrate von 1 bis (einschließlich) dieser Zahl. Sie können eine solche Funktion schreiben, mit:

fsomaq :: (Num a, Enum a) => a -> a 
fsomaq x = sum [n*n | n <- [1..x] ] 

So wir hier eine Funktion fsomaq definieren, die einen Parameter x als Eingabe verwendet, ist das Ergebnis dann sum [ n*n | n <- [1..x] ] so schreiben wir eine Liste Verständnis eine Liste von Plätzen mit n zu produzieren von 1 bis (und einschließlich x), und wir emittieren Quadrate (n*n). Wir berechnen dann die Summe dieser Liste.

Durch die Definition der Signatur als (Num a, Enum a) => a -> a können wir jede Art von Nummer verwenden, die aufzählbar ist.

Zum Beispiel:

Prelude> fsomaq 0 
0 
Prelude> fsomaq 1 
1 
Prelude> fsomaq 2 
5 
Prelude> fsomaq 4 
30 
Prelude> fsomaq 8 
204 
Prelude> fsomaq 1425 
965562425 
+0

YEESS! Ich brauchte das TakeWhile nicht, vergaß die [1..x] Danke, hat super geklappt! – Pedro

0

Sie sind in einer einzigen Zeile zu viel zu tun. Ich schlage vor, dass Sie es auseinander brechen, um über die Lösung klarer zu denken. Zum Beispiel beginnt mit:

list = [1..] 
squares = [n*n | n <- list] 

Nun, was Sie mit der Liste von Quadraten zu tun wan? Möchten Sie, dass die Werte kleiner als ein bestimmter Wert sind? Dann tun Sie so etwas wie:

squaresLessThanX x = takeWhile (<x) squares 

Jetzt wollen wir diese Quadrate zusammenzufassen:

sumSquaresLessThanX x = sum $ squaresLessThanX x 

Beachten Sie, wie viel einfacher, dies als die oneliner zu lesen ist, dass Sie versuchen. Wir vermieden auch viele der Fehler, die Sie gemacht haben, einschließlich nicht übereinstimmenden Klammern und Variablennamen falsch wiederverwenden.

+0

danke, aber jetzt habe ich ein anderes Problem, I Matrix NxN Bisher multiplizieren will ich main = bekam tun putStrLn "Digite 'matriz' seguido tun tamanho (100,1000,2000)" matriz :: Int -> [[(Int, Int)]] matriz let n = Karte (\ x -> Karte (\ y -> (x, y)) [1..n]) [1..n] Aber ich habe Probleme mit der putStrLn, das Problem ist, geben Sie einen Wert n (100,1000,2000), dann muss ich die Matrix Zeiten Matrix berechnen zB 100x100 – Pedro

+0

@Pedro Befolgen Sie die gleiche Technik, die ich hier zeigen. Brechen Sie das Problem in sehr kleine Stücke. Wenn Sie einige Dinge ausprobiert haben, veröffentlichen Sie für jedes Problem eine neue Frage. –

+0

ok, war es! Es tut mir leid, neu hier, lol – Pedro

Verwandte Themen