PostAsync
имеет параметры без карри, которые не могут быть переданы по одному, они должны быть переданы все сразу.Вот почему вы всегда должны каррировать свои параметры.
Но, увы, вы не можете контролировать определение PostAsync
, потому что это метод библиотеки .NET, поэтому вы должны обернуть его так или иначе,Есть несколько вариантов:
Опция 1 : использовать лямбда-выражение:
|> fun body -> httpClient.PostAsync( "/DoSomething", body )
Опция 2 : объявить себя функцией с каррипараметры
let postAsync client url body =
client.PostAsync(url, body)
...
|> postAsync httpClient "/DoSomething"
Обычно это мой предпочтительный вариант: перед использованием я всегда оборачиваю .NET API в форму F #.Это лучше, потому что одна и та же оболочка может преобразовывать не только параметры, но и другие вещи, такие как обработка ошибок или, в вашем случае, асинхронные модели:
let postAsync client url body =
client.PostAsync(url, body)
|> Async.AwaitTask
Опция 3 : пойди супер общий и сделай себе функцию для преобразования любых функций из не карри в карри.В других функциональных языках такую функцию обычно называют uncurry
:
let uncurry f a b = f (a, b)
...
|> uncurry httpClient.PostAsync "/DoSomething"
Одна из проблем заключается в том, что она работает только для двух параметров.Если у вас есть функция без карри с тремя параметрами, вам нужно создать для нее отдельную функцию uncurry3
и т. Д.