関数にキーワードを使用する理由をまだ理解できませんinline
。
私がまだ持っていないことは何を私に与えてくれますか?
let inline (|Positive|Neutral|Negative|) x =
match sign x with
| 1 -> Positive
| -1 -> Negative
| _ -> Neutral
関数にキーワードを使用する理由をまだ理解できませんinline
。
私がまだ持っていないことは何を私に与えてくれますか?
let inline (|Positive|Neutral|Negative|) x =
match sign x with
| 1 -> Positive
| -1 -> Negative
| _ -> Neutral
この場合、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
float
、int
、int64
などの両方が自然数であると判断できるようにしたい場合はどうすればよいでしょうか。すべての入力タイプに対してこれらの関数を複製する必要がありますか?
その必要はありません。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_Sign
int
float
、int
、およびその他の数値型の両方で関数を呼び出すことができるようになりました。
> isNatural 1.;;
val it : bool = true
> isNatural 1;;
val it : bool = true