Ich habe versucht, die folgende Funktionsdefinition zu machen:Warum funktioniert diese freie Definition in Haskell nicht?
relativelyPrime x y = gcd x y == 1
Punkt frei:
relativelyPrime = (== 1) . gcd
Jedoch gibt dies mir die folgende Fehlermeldung:
Couldn't match type ‘Bool’ with ‘a -> Bool’
Expected type: (a -> a) -> a -> Bool
Actual type: (a -> a) -> Bool
Relevant bindings include
relativelyPrime :: a -> a -> Bool (bound at 1.hs:20:1)
In the first argument of ‘(.)’, namely ‘(== 1)’
In the expression: (== 1) . gcd
In an equation for ‘relativelyPrime’:
relativelyPrime = (== 1) . gcd
ich nicht ganz verstehen. gcd
benötigt zwei Ints/Integer, gibt einen Ints/Integer zurück, dann wird Int/Integer auf "1" auf Gleichheit überprüft. Ich sehe nicht, wo mein Fehler ist.
gut 'gcd' es wird eine andere Funktion erzeugen, wenn nur ein Argument gegeben - und in Ihrem punkt- freie Version übergeben Sie diese * Funktion * an '(== 1)' die natürlich nicht mit Funktionen umgehen kann;) – Carsten
vielleicht verstehen Sie, wenn Sie zuerst * einen * Punkt * entfernen: 'relativePrime x = (= = 1). gcd x' das funktioniert!Jetzt können Sie * x nicht mehr entfernen, da es * gebunden * ist, um zu 'gcd' zu fasten - Sie könnten, wenn Sie' (== 1) $ gcd x' hatten – Carsten
@ Carstens Kommentar ist korrekt. Eine Option wäre, 'uncurry' zu verwenden, um' gcd' in eine Funktion mit einem Argument zu verwandeln (indem ein Tupel von zwei ganzen Zahlen genommen wird). – psmears