Ocaml 如何比较char选项和char

Ocaml 如何比较char选项和char,ocaml,Ocaml,因此,据我所知,char选项可以是None,也可以是任何字符,如“a” 如何将char选项与常规char进行比较 let first = Some 'a';; let second = 'a';; let third= 'b';; 如何比较first和second,使其返回true,first和second,使其返回false。在这种情况下,您可以执行三种操作之一,具体取决于您使用的方式 let first = Some 'a' let second = 'a' let third = 'b'

因此,据我所知,char选项可以是None,也可以是任何字符,如“a”

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

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

如何比较first和second,使其返回true,first和second,使其返回false。

在这种情况下,您可以执行三种操作之一,具体取决于您使用的方式

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/with
,因为如果
first
None
,则会引发
无值
异常

不过,一般来说,
匹配是最标准的方法。正如@ivg所指出的,使用匹配比构造选项对象和运行比较(特别是在限制类型和生成函数时)稍微快一些。如果速度不是一个大问题,那么两者都可以。这取决于你和什么看起来最具可读性

另外,作为一个不相关的旁注/建议:除了
main
之后,不要使用双分号,例如

let main () = begin
...
end ;;
main () ;;

你只需要这两个双分号。这种做法可以让您忘记所有奇怪的双分号规则,让您的程序“正常工作”。

我建议您使用最清晰的解决方案:

first = Some second
尽管如此,可以说这不是一种非常有效的方法,因为它执行额外的分配。但是你不应该为这个烦恼,除非它是在一个非常紧密的循环中使用的。如果它是一个紧密的循环,并且您确实使用了跟踪程序,您需要对其进行优化,那么您可以使用

let option_contains opt (x : char) = match opt with
  | None -> false
  | Some y -> x = y

请注意,此函数特别限制只接受
char
类型的值,这使得它非常快速。但同样,这只是优化中的一个游戏。一般来说,只要坚持一个最具可读性的解决方案,即,
first=somesecond

很好的答案。谢谢。您的第二个解决方案不正确:在模式匹配中,
second
在模式位置中用作catch-all变量,因此将始终采用此分支。我想你会想写一些类似于
首先匹配一些c->如果c=second然后。。。否则,如果c=第三,则。。。否则…|无->…
Michael,你完全糊涂了,你用unbound
y
做的例子完全是胡说八道,最好把它去掉。ivg,我的错误,谢谢你指出。我确实对那个例子感到困惑。我已经更新了我的答案,删除了第二次编辑并删除了我的建议,以避免出现
first=Some second
let option_contains opt (x : char) = match opt with
  | None -> false
  | Some y -> x = y