FS0001: ошибка при добавлении уравнения типа

Это сообщение присваивается, если значение определяется типом, который не объединяется с ожидаемым типом.

Следующий код демонстрирует простую версию ошибки:

let booleanBinding: bool = 10

Этот код приводит к следующим выходным данным:

error FS0001: This expression was expected to have type
    'bool'
but here has type
    'int'

Здесь требуется bool тип заметки booleanBinding типа. Однако значение 10 выводится для определения int. Так как int сообщение не boolсовпадает с данным сообщением.

Это сообщение может быть выдано во многих различных обстоятельствах, и все они следуют этому же шаблону. Вывод типа (или заметки с заданным программистом типа) "исправляет" тип функции или значения определенного типа, а затем затем этот тип используется так, как если бы он был другим типом, чем "фиксированный". Следующий код демонстрирует более сложную версию ошибки, где вывод между функциями приводит к возникновению ошибки далеко от места ожидания:

// this function has type `int -> int`.
// `+` takes the type of the arguments passed to it, and `1` is of type `int`, so
// `+` must be of type `int -> int`
let addOne i = i + 1

// this function has type `int -> int`, which may be surprising because no types are explicitly specified.
// the `printfn` call on the first line is of type `'a -> unit`, because `printfn "%A"` takes a value of any type and returns unit.
// this means that the type of the `i` parameter hasn't yet been decided based on how the parameter is used.
// the `addOne` call on the second line is of type `int -> int`, because `addOne` is of type `int -> int` (see above).
// this means that `i` _must_ be of type `int`, so the overall type signature of `printThenAdd` is inferred to be `int -> int`
let printThenAdd i =
    printfn "%A" i
    addOne i

// this line triggers the error
// > This expression was expected to have type
// >   'int'
// > but here has type
// >   'string'
// because `printThenAdd` has been inferred to have type `int -> int`, but a string was passed in as the `int` parameter
printThenAdd "a number"
|> ignore

Чтобы решить это сообщение, необходимо изменить одну из двух частей привязки: заметку типа или привязку значения.

  • Если значение правильно, измените или удалите заметку типа.

  • Если заметка типа правильна, проверка привязанное значение и убедитесь, что ошибки логики не были сделаны.