簡體   English   中英

f#區分工會通用

[英]f# discriminated union generic

可以返回“ a”值或“ b”錯誤的通用TryValue類型的語法是什么?

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

如果error是一個字符串,那就沒問題了:

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))

您缺少左側的通用參數:

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

當它只是一個參數時,可以像對待字符串一樣使用ML樣式,但是如果有多個參數,則應使用帶有< >尖括號的.NET表示法。

實際上,通過指定一個元組,舊的ML樣式也可以與多個類型參數一起使用:

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

但是,我相信我已棄用舊語法…

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM