作为课堂练习,我们应该根据年龄和性别计算夜总会人员的入场费。25 岁以下可享受 20% 折扣,女性/NB 可享受 50% 折扣,乘数叠加叠加。
虽然我的代码可以工作,但它会重复性别检查两次,这是一种糟糕的形式,可能会在更复杂的应用程序中导致问题。怎样才能避免重复呢?
(* OCaml Version *)
let entry_price age gender =
if age < 18
then (failwith "Must be over 18 to enter")
else let price = 12.0 in
if age <= 25
then let price = (price *. 0.8) in
if gender == 'f' || gender == 'x'
then (price *. 0.5)
else prix
else if gender == 'f' || gender == 'x'
then (price *. 0.5)
else price;;
Run Code Online (Sandbox Code Playgroud)
这是一个不会重复的 Python 版本,这要归功于三元运算符:(也可以使用非嵌套 if 来完成,这是 Ocaml 不允许的)
# Python version
def entry_price(age : int, gender : str):
if age < 18:
raise ArgumentError("Must be over 18 to enter")
return (
12.0
*(0.8 if (age<25) else 1)
*(0.5 if gender in ['f', 'x'] else 1)
)
Run Code Online (Sandbox Code Playgroud)
你几乎可以复制 python 版本:
let entry_price age gender =
if age < 18
then failwith "Must be over 18 to enter"
else
12.0
*. (if age < 25 then 0.8 else 1.0)
*. (if gender = 'f' || gender = 'x' then 0.5 else 1.0);;
Run Code Online (Sandbox Code Playgroud)
表达式语法仅有细微差别if,您需要使用特定于浮点的乘法运算符 ,*.而不是特定于 int 的*。
另外,需要指出的是,OCaml 中没有任何语句。语句是命令式/过程式结构,即。这样做,然后那样做。OCaml 是一种基于表达式的语言,其中每个表达式都会计算一个值。您仍然可以丢弃表达式的值,从而使其看起来像一个语句,但编译器会抱怨,除非您非常明确地丢弃它,因为这通常是用户错误。