2017-10-04 8 views
1

私はPersonのインスタンスを作成します。 PersonはAnimalの一種です。私がPersonを作成しようとすると、IDEは "この式はPerson '型を持つと予想されていましたが、ここには' Animal 'という型があります。ユニオンタイプと同じ名前の新しいオブジェクトを作成

type Person(name) = 
    member this.Name: string = name 

type Animal = 
| Person of Person 
| Cat 
| Dog 

let person: Person = Person(name = "John") 
+0

私はそれを答えのように追加しませんが、なぜならそれを 'new'を追加すると' let person:Person = new Person(name = "John") 'のように動作します。 – MarcinJuraszek

+0

@MarcinJuraszek私は 'new'キーワードを使いたくないのですが、 'new'を使うと、IDEは私に「new」が冗長であると言います。 –

+0

興味深い。私はF#Interactiveでテストしました。 – MarcinJuraszek

答えて

1

問題はPersonタイプと差別された組合の場合の両方を意味することです。

それは最後の1に解決されますので、あなたが定義を反転することができます

type Animal = 
    | Person of Person 
    | Cat 
    | Dog 
and 
    Person (name) = 
     member this.Name: string = name 

let person: Person = Person(name = "John") 

// then to create an animal 
let animal = Animal.Person (Person(name = "John")) 

代替ソリューションは@MarcinJuraszekコメントで提案されているか、DUの場合に別の名前を考慮し、ようnewキーワードを使用しますタイプ。

+0

"タイプ、例外、またはモジュール 'Person'の重複定義。 –

+0

このシナリオでは、どのように 'Animal'型の' Person'を作成しますか? – Matiasd

+0

@Matiasd私は、IDEが言うエラーだけを投稿します。そして、ユニオンPersonにはパラメータはありませんが、Personクラスはyesです。 –

1

F#の名前は、型と値へのバインディングとして機能し、いつでも名前が「ポイントしている」ものを再定義することができます。例えば。

// lets define type A 
type A(name) = member this.Name : string = name 
let x = A("test") 

// lets "bind" the type name 'A' to a new type 
type A(number) = member this.Number : int = number 
let y = A(10) 

printfn "type name of x: %s" (x.GetType().Name) // prints 'type name of x: A' 
printfn "type name of y: %s" (y.GetType().Name) // prints 'type name of y: A' 

のでxyA名前付きの型の両方のですが、同じではありません。同じロジックがPersonAnimal.Personに適用され、定義した順序によっては、最後に定義されたものはPersonと入力したときに参照されるものになります。

前述のとおり、新規または定義済みの注文を使用して両方にアクセスできます。 PersonクラスをAnimalとは別のモジュールに配置することもできます。

module Inner = 
    type Person(name) ... 

このようにして、モジュール名の前にタイプすることでアクセスできます。

関連する問題