2016-12-27 11 views
4

は、我々は非常にシンプルな機能にToStringメソッドは

let fn a = a.ToString() 

を得たことがタイプだと言う)(単位値のためとNullReferenceExceptionをスローするとNullReferenceExceptionにおける関数の結果に単位の値を渡す、しかしa -> string と推測されます。

は、上記のような単純な関数の場合、これは簡単に回避される可能性がありますが、私は、より複雑なシナリオでは、実際よ:

let eitherToHttp e = 
    match e with 
    | Either.Ok v ->  OK (v.ToString()) 
    | Either.Bad reason -> reasonToErrorCode reason 

これのタイプはEither<'a, RejectReason> -> WebPartである(実際にはどのようなWebPartEitherここでは無関係です)

eのタイプがEither<unit, RejectReason>のシナリオでは、関数は単純なシナリオの場合とまったく同じようにスローされます。

どうすればいいですか? 実際にはこれがすべての型に対して機能しない場合、型をgeneric型として推測する必要がありますか?

+3

ユニットは実行時に 'null'定数で表されるため、自然にユニットを呼び出すことはできません。 –

答えて

3

let fn a = match box a with 
      | null -> "" 
      | _ -> a.ToString() 

これはa上だけではnullチェックまでコンパイルToStringに電話をかける前に

+0

私はこのマークがなぜ受け入れられたのかを知るためにMarkの答えにコメントを読んでください。 –

+0

あなたは自分のソリューションをインライン化することができ、それがうまくいくかもしれません。あなたはそれを試すことができる – Ringil

+0

私はちょうどそれを試してみました。 'inline'を使うのは伝染病のようです。これを使うと、 'inline'関数を' inline'関数として呼び出すか、または 'inline'関数を汎用化しないようにします。可能な限りジェネリックにしたいと思う 'eitherToHttp'関数に私の質問を見てください。インライン展開は、どういうわけか私には適していないようです(しかし、私は間違っているかもしれません)。 –

6

ビルトインstring機能の代わりにオブジェクトにToStringを呼び出すの使用:あなたはこのような何かを行うことができ

> string 42;; 
val it : string = "42" 
> string();; 
val it : string = "" 
+0

私は受け入れられた答えタグを移動しているので、他の答えは、よりエレガントではないジェネリック関数を生成する一方、 'string'演算子は何とか制限されているようですが、詳細については私の他の質問をご覧ください:http:// stackoverflow .com/questions/41371190/type-in​​-to-string-vs-string-operator –

関連する問題