Types 将成员添加到比较两个数据类型值的有区别的联合中

Types 将成员添加到比较两个数据类型值的有区别的联合中,types,f#,pattern-matching,Types,F#,Pattern Matching,我刚开始玩F#,产生了以下玩具问题。我已经尝试了许多语法来实现这一点,但似乎无法正确实现 我有以下类型 type Bar = | DT of DateTime | O of float | H of float | L of float | C of float 下面是两个例子 let barPass = [ O(13200.0); H(13220.0); L(13190.0);

我刚开始玩F#,产生了以下玩具问题。我已经尝试了许多语法来实现这一点,但似乎无法正确实现

我有以下类型

type Bar = 
    | DT of DateTime
    | O of float
    | H of float
    | L of float
    | C of float
下面是两个例子

let barPass = 
    [ 
        O(13200.0);
        H(13220.0);
        L(13190.0);
        C(13210.0);
    ]  

let barFail = 
    [ 
        O(13200.0);
        H(13220.0);
        L(13290.0); // low is greater than high which is invalid
        C(13210.0);
    ] 
我想添加一个新成员,检查高点是否大于或等于低点。如果您尝试过各种模式匹配,但似乎无法正确匹配。下面的代码不正确,但足以说明我正在尝试做什么

type Bar with
    member x.HiLoCheck() =
        match x with
        | x when (H >= L) -> true // <- compiler will not allow this
        | _ -> false
使用
成员x.希洛切克()=
将x与
|当(H>=L)->真//假时的x

我想我需要把它分解成一个元组,但这也超出了我有限的f#经验。

我想你实际上想要使用一个记录作为你的数据类型,而不是一个有区别的联合列表。否则,第一步需要在列表中查找
H
和'L'元素

差不多

type Bar = 
    { DateTime : DateTime;
      O : float;
      H : float;
      L : float;
      C : float}
member x.HiLoCheck() = if x.H > x.L then true else false
编辑

使用原始DU+列表版本的答案草图-如果所需元素不在列表中,将给出错误,但这可以通过
tryFind
而不是
find
修复

let checkhilo l =
    let high = l |> List.find (function |H(_) -> true |_ -> false)
    let low = l |> List.find (function |L(_) -> true |_ -> false)
    match high,low with
    |H(h),L(lo) -> if h>lo then true else false
    |_ -> failwith "shouldn't happen"

谢谢这是我想要的。我今天才开始,所以我还不完全清楚区分联合和记录之间的区别。@ChrisTarn主要区别在于DU可以是
a
B
,也就是说,您可能有时间作为
int64
成为Unix时间的
DateTime
,而记录更像是存储数据集合的小类。@JohnPlamer谢谢。来自Java/C,这让事情变得更加清晰。