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

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

В следующем коде показана простая версия ошибки:

let booleanBinding: bool = 10

Этот код приводит к следующему результату:

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

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

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

// 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

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

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

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