Как я могу множить функцию умножения, которая получает их результат обработки другой функцией? - PullRequest
0 голосов
/ 15 января 2019

Я хотел бы разложить этот код:

(* This function is applied to the result of functions below *)
let manage_result r s =
    match r with
    | Error ( `Msg e ) ->  Tsdl.Sdl.log s e;exit 1
    | Ok a -> a

(* Examples of function I want to factorize, let's call them f_functions, f for factorize *)
let init () =
    let flag = Tsdl.Sdl.Init.everything in
    let result = Tsdl.Sdl.init flag in 
    manage_result result "Init error : %s"

let create_window title w h =
    let flag = Tsdl.Sdl.Window.windowed in
    let result = Tsdl.Sdl.create_window title ~w:w ~h:h flag in
    manage_result result "Create window error : %s"

let get_window_surface window = 
    let result = Tsdl.Sdl.get_window_surface window in
    manage_result result "Get window surface error : %s"

Как видите, две последние строки всех этих f_functions очень похожи. Я хотел бы сделать функцию, которая принимает в качестве аргумента функцию (например, если бы я хотел факторизовать init, функция, переданная в качестве параметра, была бы Tsdl.Sdl.init) и возвращать функцию, которая возвращает возвращаемое значение функции, переданной как аргумент И обработан через manage_result.

Сложность в том, что я не знаю, сколько аргументов может принимать функция f_functions.

Любые другие рекомендации приветствуются!

Спасибо.

1 Ответ

0 голосов
/ 15 января 2019

Потенциальным решением может быть использование оператора трубы, а не именование промежуточного результата

let on_error s r = manage_result r s
let create_window title w h =
    let flag = Tsdl.Sdl.Window.windowed in
    Tsdl.Sdl.create_window title ~w:w ~h:h flag
    |> on_error "Create window error : %s"

Если пойти еще дальше, мы могли бы определить собственный оператор для обработки ошибок

let ( <!> ) = manage_result

, что может сделать ваше определение достаточно легким

let create_window title w h =
    let flag = Tsdl.Sdl.Window.windowed in
    Tsdl.Sdl.create_window title ~w:w ~h:h flag
    <!> "Create window error : %s"
...