是否有类似Option<'a>的类型可以在None中保存一个字符串?

时间:2013-09-07 04:16:46

标签: f#

我需要提供一个带有None结果的解释性消息,所以基本上我希望我能够做到这样的事情:

let func x y z = if x y then Some(z) else None("It didn't work out, because blah blah blah")

这是否有标准类型?

如果不是,我可以为自己的类型使用相同的Some和None名称吗?

更新:

我尝试创建自己的联盟​​:

type CanBe<'a> =
| Some of 'a
| None of string

似乎有效,不是吗?

2 个答案:

答案 0 :(得分:7)

正如Jon Purdy所说,有一种类型可以用来做这件事,但你会更好地使用一些更具体的东西。幸运的是,实施起来相当简单:

type Result<'a> =
  | Success of 'a
  | Failure of string

let func x y z = 
  if x y then Success(z) 
  else Failure("It didn't work out, because blah blah blah")

答案 1 :(得分:5)

Microsoft.FSharp.Core中的Choice类型系列:

type Choice<'T1,'T2> =
| Choice1Of2 of 'T1
| Choice2Of2 of 'T2

传统上Choice2Of2表示失败(如Haskell中的Left)和Choice1Of2成功 - 比较Haskell的Right。但是,这些名称非常通用,您也可以自己创建成功/失败类型。