Types 将成员添加到比较两个数据类型值的有区别的联合中
我刚开始玩F#,产生了以下玩具问题。我已经尝试了许多语法来实现这一点,但似乎无法正确实现 我有以下类型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);
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,这让事情变得更加清晰。