2

現在、int または float のいずれかになる特別な型があります。それらのうちの 2 つを一緒に追加できる関数を作成したいと考えています。(必要に応じてintをfloatに強制します)関数に特別な型の戻り値の型を持たせたいです。

これが私がこれまでに持っているものです:

type number = A of int | B of float;;

let plus x1:number x2:number = (number x1) + (number x2);;

コンパイルしません。しかし、ML プログラミング言語を使用している場合に書く内容と似ています。

私のplus関数は F# でどのように見えるべきですか?

4

2 に答える 2

3
type number = A of int | B of float;;

let plus x1:number x2:number = (number x1) + (number x2);;

ここでの問題は 2 つあります。

  1. 代わりに値があるかのように、単一の値 (この例では A と B) を持つ識別共用体ケースを使用することはできません。それぞれのケースを 1 つの値を持つクラスと考えてください (バイトコードではこのように表されます)。使用する前に、クラスから値を取得する必要があります。

  2. F# では、暗黙的なキャストは許可されていません。これは、ケースから値を取得したら、それらを共通の型に変換する必要があることを意味します。この場合、値を にキャストするか、A値を にfloatキャストBする必要がありますint

@JohnPalmer が回答で述べているように、これら 2 つの問題に対処する最も明確な方法は、パターン マッチングを使用することです。

于 2013-10-25T04:34:37.477 に答える
2

したがって、最善の方法は、次のようなことをすることです

let plus x1 x2 = 
    match x1,x2 with
    |A(a),A(a2) -> float(a+a2)
    |A(a),B(b) -> float(a) + b
    |B(b),B(b2) -> b+b2
    |B(b),A(a) -> float(a) + b
于 2013-10-25T04:15:27.777 に答える