Zbyt wiele argumentów uogólnionej wersji krotnym funkcji dla BST

głosy
0

Uruchamianie krotny (+) 0 próbkę daje mi błąd o (+) jest nałożona zbyt wiele argumentów. Czemu?

data(Ord a, Show a, Read  a) => BST a = Void | Node {
    val :: a,
    left, right :: BST a
} deriving (Eq,  Ord,  Read,  Show)

sample = Node 5 (Node 3 Void Void) (Node 10 Void Void)

fold :: (Read a, Show a, Ord a) => (a -> b -> b ->  b) -> b -> BST a -> b
fold _ z Void         = z
fold f z (Node x l r) = f x (fold f z l) (fold f z r)
Occurs check: cannot construct the infinite type: a = a -> a
Probable cause: `+' is applied to too many arguments
In the first argument of `fold'', namely `(+)'
In the expression: fold' (+) 0 sample

Zobacz także: rozkładana

Utwórz 04/02/2011 o 01:23
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

Twój foldwymaga funkcji typu a -> b -> b -> bjako pierwszy parametr, który jest funkcją, która trwa trzy argumenty. (+)Z drugiej strony trwa tylko dwa argumenty.

Jeśli foldpowinien być zmieniony lub jeśli trzeba nazwać to z innej funkcji zależy od tego, co dokładnie próbujesz zrobić.

Odpowiedział 04/02/2011 o 01:28
źródło użytkownik

głosy
1

Twój problem jest ubiegasz funkcję do 3 argumenty. Pierwszy parametr w podpisie typu mówi wszystko.

fold :: (a -> b -> b -> b) -> b -> BST a -> b
fold f z (Node x l r) = f x (fold f z l) (fold f z r)

(+) Zajmuje tylko 2 argumenty, ale kiedy przechodzą go, stara się oceniać to:

(+) x (fold (+) z l) (fold (+) z r) -- 3 arguments! =P

Prawdopodobnie chcesz spasować z podwójną funkcją (a -> A -> a). Załóżmy, że chcemy użyć (+). Chcesz wynik będzie tak:

fold f z (Node x l r) = x + (fold f z l) + (fold f z r)

Stamtąd można łatwo uogólnić: po prostu zastąpić +z infixedf

fold f z (Node x l r) :: (a -> a -> a) -> a -> BST a -> a
fold f z (Node x l r) = x `f` (fold f z l) `f` (fold f z r)
Odpowiedział 04/02/2011 o 04:13
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more