2016-11-15 2 views
0

Versucht, eine Funktion für die Auflistung aller Primzahlen in einem Bereich von Zahlen zu implementieren, weiß ich, wenn ich nach Faktoren überprüfe muss ich nicht über die sqrt dieser Nummer überprüfen.Ambiguous Typ Variable in Kombination von sqrt und Boden

factors n = [x | x <- [1..(floor (sqrt n))], mod n x == 0] 
prime n = factors n == [1,n] 
listPrimesFromTill n z = [ xs | xs <- [n..z], prime xs == True] 

Ich habe nach Antworten gegrast und ich versuchte Überprüfung verschiedene Methoden wie Typ

factors :: (RealFrac b, Integral c, Floating b) => b -> c 

verwenden, aber haben kein Glück gehabt.

Jede Hilfe wird geschätzt!

+2

Ist es sinnvoll 'Floating' als Eingabe Einschränkung zu verwenden, auf' factors'? Das würde bedeuten, dass es heißt, Faktor 3.14 zu nennen. Was soll der Output sein? – crockeea

Antwort

1

Es sieht so aus, als hätten Sie sich den Code angesehen, den Sie geschrieben haben, und haben die Typen nachher herausgefunden. Im Allgemeinen ist die Haskell-Entwicklung genau umgekehrt: Zuerst ermitteln Sie die Typen, dann implementieren Sie die Funktionen. Welchen Typ sollte factors haben? Nun, man kann nur factorize ganze Zahlen sind, so etwas vom Typ, so scheint dies sinnvoll:

factor :: Integral a => a -> [a] 

Nun, wenn Sie versuchen, Ihren Code kompilieren wir die folgende Fehlermeldung erhalten:

Could not deduce (Floating a) arising from a use of `sqrt` from the context (Integral a) 

und

Could not deduce (RealFrac a) arising from a use of `sqrt` from the context (Integral a) 

Es beschwert sich, dass Sie Integral a angegeben haben, aber es benötigt Floating a für sqrt. Wir können dies tun, indem fromIntegral usinf:

sqrt   ::   Floating a => a -> a 
fromIntegral :: (Integral a, Num b) => a -> b 

factors :: Integral a => a -> [a]  vvvvvvvvvvvvvv 
factors n = [x | x <- [1..(floor (sqrt (fromIntegral n)))], mod n x == 0] 

Lesbarkeit zu erhalten,

factors n = [x | x <- [1..isqrt n], mod n x == 0] 
    where isqrt = floor . sqrt . fromIntegral 
+0

das funktioniert bei mir nicht, es wird nicht bewertet! –

+0

@FredPark bitte genauer. Was geht nicht? – ThreeFx

+0

Ändern des Codes mit Ihrer Empfehlung (was sinnvoll ist) findet keine Primzahlen aus meinem gewünschten Bereich. –