从 Ocaml 中的嵌套条件中删除重复的语句

Amy*_*ose 0 ocaml

作为课堂练习,我们应该根据年龄和性别计算夜总会人员的入场费。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)

gle*_*nsl 5

你几乎可以复制 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 是一种基于表达式的语言,其中每个表达式都会计算一个值。您仍然可以丢弃表达式的值,从而使其看起来像一个语句,但编译器会抱怨,除非您非常明确地丢弃它,因为这通常是用户错误。