2017-01-16 4 views
1

'aまたはError of'の値を返すことができる一般的なTryValueタイプの構文は何ですか?f#discriminated union generic

type TryValue = 
    | Value of 'a 
    | Error of 'b 

エラーが文字列であれば、それは大丈夫です:

type 'a TryValue = 
    | Value of 'a 
    | Error of string 

私はエラークリエーターを取るtryRun機能、関数を実行しようとする機能やパラメータを定義したいのですがパラメータとし、すべてのエラーでエラーを作成するには、エラーの作成者機能を使用します。

let tryRun createErrorFn param fn = 
    try 
     Value (fn param) 
    with 
     | ex -> Error (createErrorFn ex.Message param) 

そしてtryRunでラップする任意の関数のラッパー:

let wrapTryRun createErrorFn fn param = 
    match param with 
    | Value a -> tryRun createErrorFn a fn 
    | Error e -> Error e 

今私は(まだ完全にこれを働いていない、擬似コード)機能のリストを実行することができます。

let createErrorFn errorMessage param = 
    URLProcessignError {url=param.url;errorMessage=errorMessage} 
[fn1;fn2] |> List.fold (fun acc fn -> (wrapTryRun createErrorFn fn acc)) 
+1

に見えます[F#4.1]の結果のタイプ(https://blogs.msdn.microsoft.com/dotnet/2016/07/25/a-peek-into-f-4-1/) – s952163

答えて

4

をあなたは左サイドでの一般的なパラメータが欠落しています

type TryValue<'a,'b> = 
    | Value of 'a 
    | Error of 'b 

文字列の場合と同じように、MLスタイルを使用することができますが、複数のパラメータがある場合は、角括弧<>を使用して.NET表記を使用する必要があります。

2

実際には、古いMLスタイルはタプルを指定することにより、複数の種類のパラメータでも使用することができますがありますようにしかし、私は私が古い構文は廃止されて読んで信じて

type ('a, 'b) TryValue = 
    | Value of 'a 
    | Error of 'b 

...

+1

本当に推奨されていないとは思わないあなた自身のタイプについてアドバイスされていません。多くの人は、コンパイラの通常の出力構文に従い、リストやオプションなどの組み込み型や他の型のC#スタイルにMLスタイルを使用します。個人的には、一貫性のためにどこでもC#スタイルを使用することを好みます。 – Tarmil

+0

mlスタイルは、MLをF#に変換するときに便利です。 MLスタイルが償却された場合、MLをF#に変換することは難しくなります。 –