我正在为一个图像处理任务做一些工作(这里没有太大的相关性),我偶然发现了F#选项类型的行为让我吃惊,关于执行大于(>)的比较。我找不到任何东西可以直接解释我对堆栈溢出、F#docs或更广泛的web的期望(更多信息见下文)。
我看到的具体部分如下所示:
let sort3Elems (arr: byte option []) =
if arr.[0] > arr.[1] then swap &arr.[0] &arr.[1]
if arr.[1] > arr.[2] then swap &arr.[1] &arr.[2]
if arr.[0] > arr.[1] then swap &arr.[0] &arr.[2]
let arr: byte option [] = Array.zeroCreate 4;;
val arr : byte option [] = [|None; None; None; None|]
> arr.[0] <- Some(127uy);;
val it : unit = ()
> arr.[2] <- Some(55uy);;
val it : unit = ()
> arr.[0] > arr.[2];;
val it : bool = true
> arr.[0] < arr.[2];;
val it : bool = false
> arr.[0] < arr.[1];;
val it : bool = false
> arr.[0] > arr.[1];;
val it : bool = true
> arr.[2] > arr.[1];;
val it : bool = true
> arr.[3] > arr.[1];;
val it : bool = false
> arr.[3] < arr.[1];;
val it : bool = false
> arr.[3] > arr.[1];;
val it : bool = false
为了证实这一点,我试图找到一些东西来解释我应该期望的行为,但我找不到任何东西来解决这个问题。这个
Option page in the MS F# Guide docs
没有提到,而且我在F#这样的地方也找不到任何好玩和赚钱的东西。我甚至在微软API文档的任何地方都找不到关于选项的页面。。。看着
the source for Option in the F# GitHub repo
什么都没告诉我。我能找到的最好的就是
a blog post by Don Syme
从几年前开始,这并没有真正回答我的问题。有一小部分堆栈溢出问题讨论了与比较运算符或选项类型相关的主题,但我没有发现任何涉及两者结合的问题。
所以,我的问题是,在期权类型上执行大于/小于比较是否会返回我上面推测的结果?我猜这在F#程序员中是相当常见的知识,但这对我来说是个新闻。作为一个次要/相关的问题,是否有人知道我可以/应该在哪里寻找更多信息?谢谢。