Próbowałem zrobić następującą definicję funkcję:Dlaczego ta punktowa definicja nie działa w Haskell?
relativelyPrime x y = gcd x y == 1
punkt bezpłatny:
relativelyPrime = (== 1) . gcd
Jednak to daje mi następujący błąd:
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
nie mam dość Rozumiesz. gcd
pobiera dwa Ints/Integer, zwraca jeden Ints/Integer, a następnie jeden Int/Integer jest sprawdzany pod kątem równości '1'. Nie widzę, gdzie jest mój błąd.
dobrze 'gcd' będzie produkować inną funkcję, jeśli podano tylko jeden argument - w punkt-a darmowa wersja przekazujesz tę * funkcję * do '(== 1)', która oczywiście nie wie, jak obsługiwać funkcje;) – Carsten
może rozumiesz, kiedy po raz pierwszy * usuniesz * jeden * punkt *: 'relativePrime x = (= = 1). gcd x' to działa!Teraz nie możesz * usunąć * 'x', ponieważ jest * przywiązany * do szybkiego do' gcd' - mógłbyś, gdybyś miał '(== 1) $ gcd x' – Carsten
@ Komentarz Carstena jest poprawny. Jedną opcją byłoby użycie 'uncurry', aby zamienić' gcd' w funkcję pojedynczego argumentu (biorąc krotkę dwóch liczb całkowitych). – psmears