Можно ли написать флип-функцию Хаскелла в Rust? - PullRequest
4 голосов
/ 01 мая 2019

Функция Хаскелла flip определяется следующим образом:

flip :: (a -> b -> c) -> b -> a -> c
flip f x y =  f y x

Все, что он делает, это берет функцию и возвращает другую функцию, у которой два параметра обращены. Если бы вы вызвали функцию f как f a b (f(a, b) в Rust-подобном синтаксисе), вы бы назвали flip f как (flip f) b a.

Моя неудачная попытка написать это в Rust:

fn flip<A, B, C, F: Fn(A, B) -> C>(f: F) -> impl Fn(B, A) -> C {
    |a, b| f(b, a)
}

Можно ли написать это в Rust?

1 Ответ

9 голосов
/ 01 мая 2019

Я не уверен, какую ошибку вы получаете, но я смог правильно ее реализовать с помощью этого кода ( ссылка на игровую площадку для тестирования ):

fn flip<A, B, C, F>(f: F) -> impl Fn(B, A) -> C where F: Fn(A, B) ->C {
    move |a,b| f(b, a)
}

fn main() {
    let sub = |a, b| a - b;
    let flipped = flip(sub);
    println!("Result: {}", flipped(5, 10));
}

Обратите внимание наКлючевое слово move здесь, которое необходимо, чтобы возвращаемое flip замыкание вступило во владение f.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...