F# に次のコードがあります。
let CreateSampleDataFromJson<'T>(path) =
let uri = new Uri(path)
async {
let file = StorageFile.GetFileFromApplicationUriAsync(uri)
let jsonText = FileIO.ReadTextAsync(file)
return JsonObject<'T>.Parse(jsonText)
}
私が抱えている問題は、それfile
が予想通りIAsyncOperation<StorageFile>
であり、そうではないということです。StorageFile
ReadTextAsync
C# では、次のようなことができます。
var file = await StorageFile.GetFileFromApplicationUriAsync(uri)
すなわち
public async Task<T> CreateSampleDataFromUrl<T>(string path)
{
var uri = new Uri(path);
var file = await StorageFile.GetFileFromApplicationUriAsync(uri);
var jsonText = await FileIO.ReadTextAsync(file);
return JsonObject<T>.Parse(jsonText);
}
IAsyncOperation
問題は、F# でawait を行う方法がわからないことです。いつもlet!
は通用しない。つまり、以下はコンパイルに失敗します:
async {
let! file = StorageFile.GetFileFromApplicationUriAsync(uri)
コンパイラエラーで:
error FS0001: This expression was expected to have type Async<'a> but here has type IAsyncOperation<StorageFile>
次のように使用できるクラスでAsTask()
定義された拡張メソッドがあると述べたドキュメントを見つけました。System.WindowsRuntimeSystemExtensions
let! file = StorageFile.GetFileFromApplicationUriAsync(uri).AsTask() |> Async.AwaitTask
これを行う標準的な方法や、これを少し良くする F# ライブラリのどこかで利用できるものはありますか?