2

関数にキーワードを使用する理由をまだ理解できませんinline

私がまだ持っていないことは何を私に与えてくれますか?

let inline (|Positive|Neutral|Negative|) x =
 match sign x with
 | 1 -> Positive
 | -1 -> Negative
 | _ -> Neutral
4

1 に答える 1

10

この場合、inlineキーワードを削除しようとすると、何が得られるかを理解しやすくなります。

let (|Positive|Neutral|Negative|) x =
    match sign x with
    | 1 -> Positive
    | -1 -> Negative
    | _ -> Neutral

このアクティブなパターンのタイプはfloat -> Choice<unit,unit,unit>です。floatコンパイラは、入力に対してのみ機能すると推測していることに注意してください。

このパターンを使用する関数も定義すると、この結果が最も明白になる可能性があります。たとえば、数値が自然数かどうかを判断する関数などです。

let isNatural = function
    | Positive -> true
    | _ -> false

この関数の型float -> boolは です。つまり、float入力でのみ使用できます。

> isNatural 1.;;
val it : bool = true
> isNatural 1;;

>   isNatural 1;;
  ----------^

stdin(4,11): error FS0001: This expression was expected to have type
    float    
but here has type
    int

floatintint64などの両方が自然数であると判断できるようにしたい場合はどうすればよいでしょうか。すべての入力タイプに対してこれらの関数を複製する必要がありますか?

その必要はありません。inline次の機能を実行できます。

let inline (|Positive|Neutral|Negative|) x =
    match sign x with
    | 1 -> Positive
    | -1 -> Negative
    | _ -> Neutral

let inline isNatural x =
    match x with
    | Positive -> true
    | _ -> false

inlineキーワードにより、コンパイラは関数の型をジェネリックに保ちます。

> 
val inline ( |Positive|Neutral|Negative| ) :
  x: ^a -> Choice<unit,unit,unit> when  ^a : (member get_Sign :  ^a -> int)
val inline isNatural : x: ^a -> bool when  ^a : (member get_Sign :  ^a -> int)

これは、その型を入力として受け取り、 を返す関数が存在する限り、任意の型を入力に使用できることを意味します。get_Signint

floatint、およびその他の数値型の両方で関数を呼び出すことができるようになりました。

> isNatural 1.;;
val it : bool = true
> isNatural 1;;
val it : bool = true
于 2016-04-12T05:42:49.547 に答える