据我所知,char选项可以是None或任何字符,例如'a'。
如何将char选项与常规char进行比较。
let first = Some 'a';;
let second = 'a';;
let third= 'b';;
我如何比较第一个和第二个,所以它返回true,第一个和第三个,所以它返回false。
答案 0 :(得分:5)
在这种情况下,您可以执行以下三种操作之一,具体取决于您的使用方式
let first = Some 'a'
let second = 'a'
let third = 'b'
首先,您可以将非选项变量转换为选项,然后通过执行以下操作来测试(结构)相等:
if first = Some second then begin
Printf.printf "First and Second are equal!"
end
其次,您可以使用匹配语句。这是解开"解开"更标准的方式。选项:
match first with
| Some c ->
if c = second then print_endline "First and second are equal";
if c = third then print_endline "First and third are equal."
| None -> print_endline "None."
此外,您可以将匹配包装在函数中,就像@ivg在他的示例中所做的那样。
最后,您可以使用BatOption.get
:
try
if BatOption.get first = second then print_endline "First and second are equal";
if BatOption.get first = third then print_endline "First and third are equal";
with
No_value -> print_endline "ERROR: No value!!"
如果您使用BatOption.get
,则您希望将其包含在try/with
中,因为如果first
为None
,则会引发No_value
例外。
一般而言,match
是最标准的做法。正如@ivg所指出的,使用匹配比构造Option对象和运行比较要快一些(特别是在限制类型和生成函数时)。如果速度不是一个很大的问题,那么要么是好的。它取决于你和最可读的东西。
此外,作为不相关的旁注/建议:除了main
之外,不要使用双分号,例如,
let main () = begin
...
end ;;
main () ;;
你只需要那两个双分号。这种做法可以让你忘记所有奇怪的双分号规则并让你的程序"只是工作"。
答案 1 :(得分:2)
我建议你使用最明确的解决方案:
first = Some second
虽然可以说这不是一种非常有效的方式,因为它执行额外的分配。但是你不应该为此烦恼,除非它在一个非常紧凑的循环中使用。如果它是一个紧密的循环,你真的精确定位了一个跟踪器,你需要优化它,那么你可以使用
let option_contains opt (x : char) = match opt with
| None -> false
| Some y -> x = y
注意,此函数是特殊约束,只接受char
类型的值,这使得它非常快。但同样,这只是优化中的一个游戏。通常只需坚持使用最易读的解决方案,即first = Some second
。