Ocaml 如何比较char选项和char
因此,据我所知,char选项可以是None,也可以是任何字符,如“a” 如何将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'
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,你完全糊涂了,你用unboundy
做的例子完全是胡说八道,最好把它去掉。ivg,我的错误,谢谢你指出。我确实对那个例子感到困惑。我已经更新了我的答案,删除了第二次编辑并删除了我的建议,以避免出现first=Some second
。
let option_contains opt (x : char) = match opt with
| None -> false
| Some y -> x = y