代码之家  ›  专栏  ›  技术社区  ›  Jarak

期权大于(和等于)的行为

  •  4
  • Jarak  · 技术社区  · 8 年前

    我正在为一个图像处理任务做一些工作(这里没有太大的相关性),我偶然发现了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#程序员中是相当常见的知识,但这对我来说是个新闻。作为一个次要/相关的问题,是否有人知道我可以/应该在哪里寻找更多信息?谢谢。

    1 回复  |  直到 8 年前
        1
  •  7
  •   Tomas Petricek    8 年前

    F#编译器会自动为区分的并集和记录类型生成比较。因为option只是一个有区别的并集,所以这也意味着您可以自动比较并集。我不确定是否有一个很好的网页记录这一点,但你可以找到一个描述中 section 8.15.4 in the F# specification :

    8.15.4生成的CompareTo实现的行为

    对于类型T,生成System.IComparable.CompareTo比较实施如下 跟随:

    • 如果T是引用类型,y为null,则返回1。
    • 如果T是结构或记录类型,则调用FSharp.Core.Operators运算符.在每个对应的对上进行比较
    • 对于这两个值,然后在每个对应的字段对上为x和y所携带的数据

    正如上一个案例中所记录的,选项的案例首先比较案例。 None 索引小于 Some 没有 值总是小于任何值 价值观。如果情况相符,那么 None = None 和 Some n 具有 Some m 比较依据 n 和 m .