Fable - невозможно получить информацию о типе универсального параметра, пожалуйста, встроите или введите преобразователь типа - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь написать общую функцию декодирования JSON в басне.Кажется, что он компилируется в FSharp, но я получаю сообщение об ошибке для этого кода:

[с использованием библиотеки Thoth.Json и библиотеки Fetch из Fable.PowerPack]

let autoDecoder<'a> (json:string) (value:obj) : Result<'a, Thoth.Json.Decode.DecoderError> =
    let tryDecode = Thoth.Json.Decode.Auto.fromString<'a>(json)
    let getDecoderError (str:string) : Thoth.Json.Decode.DecoderError = ( "Auto decode Error", Thoth.Json.Decode.FailMessage str) 
    Result.mapError getDecoderError tryDecode

error FABLE:Не удается получить информацию о типе универсального параметра, пожалуйста, встроите или введите преобразователь типа

Я не уверен, как это исправить, и не смог найти ничего в Google.

Я хочучтобы иметь возможность вызывать функцию, подобную этой, в моей функции обновления в Fable Elmish:

let update (msg:Msg) (model:Model) =
    match msg with
..
    | OrStart ->
        let getData() = Fetch.fetchAs<ResultResponse>  "https://randomuser.me/api/" json.autoDecoder<ResultResponse> http.getHeaders
        model, Cmd.ofPromise getData () LoadedTypedData FetchError

Как мне получить возможность компилировать функцию autoDecoder <'a>, сохраняя ее универсальной?

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Я думаю, что Fable говорит вам использовать inline следующим образом:

let inline autoDecoder<'a> (json:string) (value:obj) : Result<'a, Thoth.Json.Decode.DecoderError> =
    let tryDecode = Thoth.Json.Decode.Auto.fromString<'a>(json)
    let getDecoderError (str:string) : Thoth.Json.Decode.DecoderError = ( "Auto decode Error", Thoth.Json.Decode.FailMessage str) 
    Result.mapError getDecoderError tryDecode

Это потому, что для каждого вызова необходимо создавать универсальные функции, такие как встроенные функции.

Кстатипараметр value не используется.

Вы также можете упростить код следующим образом:

let inline autoDecoder<'a> (json:string) : Result<'a, Thoth.Json.Decode.DecoderError> =
    Thoth.Json.Decode.Auto.fromString<'a> json
    |> Result.mapError (fun (str:string) ->  "Auto decode Error", Thoth.Json.Decode.FailMessage str) 
0 голосов
/ 23 ноября 2018

Я новичок в fable и не смог заставить его работать, компилятор fable не разрешает автоматическое декодирование без указанного типа - здесь происходит сбой:

Thoth.Json.Decode.Auto.fromString<'a>(str, true)

Но для всех, кто боретсяс помощью api fetch в fable это можно сделать с помощью не слишком большого стандартного кода.Я не мог получить обещание быть универсальным, но реализация для конкретного типа, такая как getCustomers, довольно лаконична, и я закончил тем, что сделал что-то вроде этого:

type Msg =
    | Start
    | LoadedCustomerData of Result<QueryDataForJson, string>
..

let getCustomers () = promise {
    let! response = Fetch.fetch "http://localhost:5000/spa/api/customers" http.getHeaders
    let! text = response.text()
    return Thoth.Json.Decode.Auto.fromString<QueryDataForJson>(text, true)
}
..
let update (msg:Msg) (model:Model) =
    match msg with
    | Start ->
        model, Cmd.ofPromise getCustomers () LoadedCustomerData FetchError
    | LoadedCustomerData resp ->
        match resp with
            | Ok qdj -> { model with gridData= queryDataFromJson qdj; message= "Loaded Customer Data"  }, Cmd.none
            | Error str -> { model with message = str }, Cmd.none
...