引数の型に基づいて、C++ で特定の関数を実装する方法があります。F# でこれに似たものはありますか?
質問する
340 次
1 に答える
5
簡単な答えは NO です。その理由は、John がリンクした質問で説明されています。
これは F# 固有というよりも .NET の機能ですが、メソッドのオーバーロードで動作します。
type T = T with
static member test (x:'a list) = "Generic version"
static member test (x:int list) = "Specialized for int"
static member test (x:char list) = "Specialized for char"
> T.test ["0"] ;;
val it : string = "Generic version"
> T.test [0] ;;
val it : string = "Specialized for int"
しかし、関数ではこれを行うきれいな方法はありません。次のようないくつかのトリックを見つけることができます:
type T = T with
static member ($) (a:T, x:'a list) = "Generic version"
static member ($) (a:T, x:int list) = "Specialized for int"
static member ($) (a:T, x:char list) = "Specialized for char"
let inline f a = T $ a : string
> f ["0"] ;;
val it : string = "Generic version"
> f [0] ;;
val it : string = "Specialized for int"
しかし、これは非常に限られています。現在のバージョンの F# では常に同じオーバーロード解決を反映できるとは限らない静的制約を持つインライン関数を作成するため、このアプローチでは遠くまで行くことができないと思います。
于 2013-09-28T18:20:58.733 に答える