如何在F#中返回特定类型的元组?

时间:2015-08-13 14:19:17

标签: f#

这是我正在处理的代码:

// RopResult
type RopResult<'TSuccess, 'TMessage> =
    | Success of 'TSuccess * 'TMessage list
    | Failure of 'TMessage list

// result to return
type ResultForClient<'TSuccessObj, 'TMessages> =
    bool * 'TSuccessObj * seq<'TMessages>

// return the above type
let resultToClient =
    function 
    | Success (x, msg) -> true, x, Seq.ofList msg
    | Failure errors -> false, Object(), Seq.ofList errors

resultToClient函数似乎只返回与特定元组类型ResultForClient相对的元组。我在这里错过了什么?在旁注中,我在回报中正确表示RopResult类型。正如您所看到的,RopResult是通用的,因此如果失败,我会插入Object()。这看起来是否正确?

2 个答案:

答案 0 :(得分:3)

指定返回类型:

let resultToClient v : ResultForClient<_,_> =
  match v with 
  | Success (x, msg) -> true, x, Seq.ofList msg
  | Failure errors -> false, Object(), Seq.ofList errors

答案 1 :(得分:2)

看起来你正试图做Railway Oriented Programming

  

我在回程中正确表示RopResult类型。正如您所看到的,RopResult是通用的,所以如果失败,我会插入Object()。这看起来是否正确?

不,这似乎不正确。使用Object()resultToClient的推断类型为

RopResult<System.Object,'a> -> ResultForClient<System.Object,'a>

由于ResultForClient只是一个类型别名,因此等同于

RopResult<Object,'a> -> bool * Object * seq<'a>

即,函数的返回值为bool * Object * seq<'a>。与Fucntional数据类型相比,这看起来更像是返回代码和无类型数据的讨厌组合。那是你的想法吗?你打算用Object做什么?

铁路导向编程的意义在于RopResult数据类型本身带有关于任何计算结果的信息(无论是否失败),所以除非你试图与其他系统互操作不理解总和类型(Discriminated Unions),你只会试图'打开'RopResult来丢弃信息。