For mange argumenter i generalisert versjon av falsfunksjonen for BST

stemmer
0

Kjører ganger (+) 0-prøven gir meg en feilmelding om at (+) blir brukt for mange argumenter. Hvorfor?

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

Se også: fold

Publisert på 04/02/2011 klokken 00:23
kilden bruker
På andre språk...                            


2 svar

stemmer
1

Søket foldkrever en funksjon av typen a -> b -> b -> bsom den første parameter, er det en funksjon som tar tre argumenter. (+)på den annen side tar bare to argumenter.

Hvis foldbør endres, eller hvis du trenger kalle det med en annen funksjon, avhenger av hva du prøver å gjøre.

Svarte 04/02/2011 kl. 00:28
kilden bruker

stemmer
1

Ditt problem er at du søker funksjonen til 3 argumenter. Den første parameteren i den type signaturen sier alt.

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)

(+) Tar bare 2 argumenter, men når du passerer den på, den prøver å evaluere dette:

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

Du har sannsynligvis vil kaste seg med en binær funksjon (a -> a -> a). Tenk deg at du ønsker å bruke (+). Du vil at resultatet skal bli som dette:

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

Derfra er det lett å generalisere: bare erstatte +med en infiksertf

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)
Svarte 04/02/2011 kl. 03:13
kilden bruker

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