1

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>であり、そうではないということです。StorageFileReadTextAsync

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# ライブラリのどこかで利用できるものはありますか?

4

1 に答える 1