如何将char选项与char进行比较

时间:2015-04-13 22:53:06

标签: ocaml

据我所知,char选项可以是None或任何字符,例如'a'。

如何将char选项与常规char进行比较。

let first = Some 'a';;
let second = 'a';;
let third= 'b';;

我如何比较第一个和第二个,所以它返回true,第一个和第三个,所以它返回false。

2 个答案:

答案 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中,因为如果firstNone,则会引发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