Ошибка ограничения значения 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
.