0

引数が数値の場合は平方根を返し、それ以外の場合は引数を返す単純な関数で F# パターン マッチングを学習し続けています。私はそれを少し変更しましたが、次のようになります。

let my_sqrt (o: obj) =
  match o with
  | :? float as d -> (sqrt d).ToString()
  | _ as x -> x.ToString()

私の目的には問題なく機能していますが、戻り値を文字列にキャストしたくない場合はどうすればよいですか? 「何らかのオブジェクト」を返して、それをprintfn "%A" (my_sqrt [| 1; 2; 3 |])構築に使用するにはどうすればよいですか?

4

5 に答える 5

8

あなたの例はあなたがやろうとしていることのデモンストレーションにすぎませんが、これはおそらく良い設計ではないことを指摘する価値があります. F# では、通常、キャストを使用してオブジェクトを操作する関数は使用しません。これを表すより良い方法は、判別共用体です。

type MyInput = 
  | Numeric of float
  | Other of obj

let my_sqrt = function
  | Numeric d -> Numeric (sqrt d)
  | Other o -> Other o

この関数は、 または のいずれかの型で機能しNumericますOtherが、DU のおかげで、キャストは必要ありません。これらの線に沿った何かが、実際の問題に対するより良いアプローチになると思います。

于 2013-05-24T09:08:57.527 に答える
5

私はあなたが欲しいと思います

let my_sqrt (o: obj) =
  match o with
  | :? float as d -> (sqrt d) :> obj
  | _ as x -> x

オブジェクトにアップキャストするだけ

于 2013-05-23T11:18:01.247 に答える
0

あなたの機能は大丈夫だと思います。各平方根を計算したい場合は、次のように関数を配列にマップする必要があります。

Array.map my_sqrt [| 1.0; 2.0; 3.0 |] |> printfn "%A"
于 2013-05-23T11:32:14.477 に答える
0

私は、差別された組合を使用する方が良いというトーマスに同意します。F# に組み込まれている Each モナドはありませんが、Choice ユニオンを使用してインターフェイスを標準化できます。

let my_sqrt (o : obj) = 
  match o with 
  | :? float as d -> Choice1Of2 (sqrt d) 
  | o -> Choice2Of2 o;;
于 2013-05-24T10:49:43.430 に答える