Mari kita pertimbangkan kode ini:

type TypeA = 
    {
        A : int
    }

type TypeB =
    {
        B : float
    }

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

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

Itu menghasilkan kesalahan:

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

Apa yang saya tidak mengerti adalah mengapa ada tabrakan antara dua variabel 'c'.

Mereka memiliki cakupan yang berbeda:

type TypeA = 
    {
        A : int
    }

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

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

Dengan

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

Memberi

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

Adakah yang bisa menjelaskan mengapa ada kesalahan ini?

0
Thomas 1 Maret 2020, 00:15

1 menjawab

Jawaban Terbaik

Tidak ada tabrakan antara dua variabel c - keduanya didefinisikan dalam modul terpisah. F# tidak bisa secara implisit mengubah integer literal 0 ke float. Gunakan 0.0 atau 0. dalam kasus kedua:

let mutable c : TypeB = { B = 0.0 }

Juga, inferensi tipe F# cukup pintar untuk menyimpulkan bahwa variabel pertama c bertipe TypeA, dan variabel kedua c bertipe TypeB (karena label rekaman berbeda) sehingga Anda bahkan dapat menghapus anotasi jenis di sini:

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

module Test2 =
    let mutable c = { B = 0. } // TypeB inferred
3
Sergey Berezovskiy 29 Februari 2020, 21:37