Ошибка ограничения значения Saturn, когда модуль находится в отдельном файле

Когда я перемещаю модуль UiRoutes в отдельный файл, он выдает ошибку при компиляции. Это первый раз, когда используются Сатурн и Жираф, поэтому я не уверен, что происходит? В чем разница, если модуль находится в отдельном файле?

Я получаю следующее сообщение об ошибке: «Ограничение значения. Предполагается, что значение 'uiRouter' имеет общий тип \n valuiRouter: (HttpFunc -> '_a -> HttpFuncResult) when'_a:> AspNetCore.Http.HttpContext \nЛибо make аргументы для 'uiRouter' явным образом или, если вы не хотите, чтобы он был универсальным, добавьте аннотацию типа ".

Program.fs

      open Saturn
// MongoDB.FSharp.Serializers.Register()

module ApiRoutes =

    open Giraffe

    let apiRoutes =
        router {
            get "/GetAllCars" (DBApi.GetAllCars |> json)
            get "/InsertCars" (DBApi.InsertAll() |> json)
            get "/FindByInformalName" (DBApi.FindByInformalName "TM3" |> json)
        }


module UiRoutes =

    open Giraffe
    open Giraffe.ViewEngine
    open DBApi

    let carsView =
        html [] [
            //Some HTML
        ]

        let uiRouter = htmlView carsView //HttpFunc -> AspNetCore.Http.HttpContext -> HttpFuncResult  
    


let appRouter =
    router {
        forward "/api" ApiRoutes.apiRoutes
        forward "" UiRoutes.uiRouter
    }

let myApp = application { use_router appRouter }
run myApp

1 ответ

F# компилирует каждый файл отдельно. Когда вы перемещаете определение в файл, отличный от того, в котором оно используется, компилятор F # больше не может сделать вывод о том, что он имеет неуниверсальный тип. Другими словами, при компиляции UiRoutes.fs, компилятор не может сказать, что вы хотите иметь точный тип HttpFunc -> AspNetCore.Http.HttpContext -> HttpFuncResult. Поскольку F # не позволяет иметь общее значение, вы получите ошибку ограничения значения.

Вот два способа избежать этой ситуации:

  • Убедитесь, что он ограничен неуниверсальным типом путем последующего использования значения в том же файле, где оно определено.
  • Предоставьте явную аннотацию типа, чтобы вручную ограничить тип uiRouter.
Другие вопросы по тегам