Сфера путаницы в F # - PullRequest
       8

Сфера путаницы в F #

0 голосов
/ 01 марта 2020

Давайте рассмотрим этот код:

type TypeA = 
    {
        A : int
    }

type TypeB =
    {
        B : float
    }

module Test =
    let mutable c : TypeA = { A = 0 }

module Test2 =
    let mutable c : TypeB = { B = 0 }

выдает ошибку:

typecheck error This expression was expected to have type
    'float'    
but here has type
    'int'    

Что я не понимаю, так это то, почему существует конфликт между двумя переменными ' c '.

Они имеют разные области действия:

type TypeA = 
    {
        A : int
    }

module Test =
    let mutable c : TypeA = { A = 0 }

module Test2 =
    let mutable c : TypeA = { A = 0 }

с

Test.c <- { A = 1 }
Test2.c <- { A = 2 }
Test.c, Test2.c

дает

{FSI_0009 + TypeA: A: 1} {FSI_0009 + TypeA: A: 2}

Может кто-нибудь объяснить, почему существует эта ошибка?

1 Ответ

3 голосов
/ 01 марта 2020

Нет конфликта между двумя переменными c - они определены в отдельных модулях. F # просто не может неявно преобразовать целочисленный литерал 0 в число с плавающей точкой. Используйте 0.0 или 0. во втором случае:

let mutable c : TypeB = { B = 0.0 }

Кроме того, вывод типа F # достаточно умен, чтобы сделать вывод, что первая переменная c имеет тип TypeA, а вторая переменная c имеет тип TypeB (поскольку метки записи отличаются), поэтому вы даже можете удалить аннотации типов здесь:

module Test =
    let mutable c = { A = 0 } // TypeA inferred

module Test2 =
    let mutable c = { B = 0. } // TypeB inferred
...