Функция ocaml выполняет функцию в качестве параметра и выводит функцию

Мне нужно найти способ объединить две функции и вывести их как одну.

I have the following code where take in a list of function ('a->'a) list then output a function ('a->'a) using the List.fold_left.

I figured out the base case, but I tried a lot of ways to combine two functions. The output should have the type ('a -> 'a) list -> ('a -> 'a).

Пример вывода:

# pipe [] 3;;
- : int = 3 
# pipe [(fun x-> 2*x);(fun x -> x + 3)] 3 ;;
- : int = 9 
# pipe [(fun x -> x + 3);(fun x-> 2*x)] 3;;
- : int = 12

функция:

let p l = 
  let f acc x = fun y-> fun x->acc   in  (* acc & x are functions 'a->'a *)
  let base =  fun x->x in
    List.fold_left f base l
1
nl ja de

1 ответы

Since you know that you have to use a left fold, you now have to solve a fairly constrained problem: given two functions of type 'a -> 'a, how do you combine them into a single function of the same type?

На практике существует один общий способ комбинирования функций: состав. В математике это обычно записывается как f ∘ g , где f и g - это функции. Эта операция создает новую функцию, которая соответствует принятию аргумента, применяя к нему g , а затем применяя f к результату. Поэтому, если h = f ∘ g , мы также можем записать это как h (x) = f (g (x)) .

So your function f is actually function composition. (You should really give it a better name than f.) It has to take in two functions of type 'a -> 'a and produce another function of the same type. This means it produces a function of one argument where you produce a function taking two arguments.

So you need to write a function compose (a more readable name than f) of type ('a -> 'a) -> ('a -> 'a) -> ('a -> 'a). It has to take two arguments f and g and produce a function that applies both of them to its argument.

Надеюсь, это прояснит, что вам нужно сделать. Выяснить, как именно это делать в OCaml - это здоровое упражнение.

1
добавлено
@ user1968057, вы должны спросить себя, что такое параметр y в вашем существующем коде. В чем его цель? Почему вы положили его туда, вместо того, чтобы поместить его в последнюю позицию? Почему у вас есть 3 параметра ( acc , y , x )? Вы также должны посмотреть на определение определения в объяснениях и посмотреть, сколько там переменных.
добавлено автор didierc, источник
Ах. Я не совсем понимаю, что вы имеете в виду. Если вы хотите взять два аргумента и вывести функцию одного аргумента, вы можете написать что-то вроде let compose f g = fun x -> ... . Здесь f и g являются нормальными аргументами; результатом является функция, ожидающая одного аргумента x . Это помогает?
добавлено автор Tikhon Jelvis, источник
Я знаю, как функция вызывает, но я не могу найти тот, который нужно вызвать в первую очередь вызова x, есть ли пример, что функция принимает 2 функции как параметр и вывод как функцию?
добавлено автор user1968057, источник
пусть f acc x = fun y -> x (acc), но теперь функция принимает в (('a ->' a) -> 'a) list ->' a -> 'a
добавлено автор user1968057, источник
он работает сейчас, когда вы сказали мне определить функцию компоновки, thx. Но есть ли способ не писать дополнение?
добавлено автор user1968057, источник
Я думаю, что это связано с тем, что проблема имени функции f acc x, если я называю ее чем-то другим, я могу просто выполнить функцию компоновки внутри
добавлено автор user1968057, источник
ReasonML и OCaml
ReasonML и OCaml
214 участник(ов)