Слишком много аргументов в обобщенной версии кратного функции для BST

голоса
0

Запуск раза (+) 0 образца дает мне ошибку о (+), внесенной слишком много аргументов. Зачем?

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

Смотрите также: свернуть

Задан 04/02/2011 в 01:23
источник пользователем
На других языках...                            


2 ответов

голоса
1

Ваш foldтребует функции типа в a -> b -> b -> bкачестве первого параметра, то есть функция , которая принимает три аргумента. (+)с другой стороны , принимает только два аргумента.

Если foldнеобходимо изменить или , если вам нужно вызвать ее с другой функцией , зависит от того, что именно вы пытаетесь сделать.

Ответил 04/02/2011 в 01:28
источник пользователем

голоса
1

Ваша проблема вы подаете функцию 3 аргументов. Первый параметр типа подписи говорит все это.

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)

(+) Принимает только 2 аргумента, но когда вы передаете его, он пытается оценить это:

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

Вы, вероятно, хотите, чтобы сложить с бинарной функции (а -> а -> а). Предположим, что вы хотите использовать (+). Вы хотите, чтобы результат быть похожим на это:

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

Оттуда легко обобщаются: просто заменить +с инфиксальнымf

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)
Ответил 04/02/2011 в 04:13
источник пользователем

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