Andreas Rossberg发现了一个问题,但你也看到了一些
operator precedence
问题。
这类事情:
printf "ERROR: " ^ error_message
还有这个:
printf "HTTP Code: " ^ Int.to_string code
看起来很可疑,因为
printf "HTTP code: "
评估为
()
无法提供给
^
。看起来你是想写这样的东西:
printf ("HTTP Code: " ^ Int.to_string code)
但你也可以利用
printf
编写以下内容,它更清晰,没有运算符优先级问题。
printf "HTTP Code: %d" code
还要小心打开几个模块。如果多个运算符定义了相同的运算符,或者它们重新定义了标准库运算符,则可能会出现一些意外行为。
除了完全符合条件的名字,你还可以
当地
开放模块,缓解了这个问题。但是,由于您已经在代码中使用过一次,因此您似乎知道这个选项。
从风格上讲,我可能只是重构了这个:
let error_message =
json |> member "error" |> member "error_message" |> to_string
in
printf "ERROR: " ^ error_message
致:
json
|> member "error"
|> member "error_message"
|> to_string
|> printf "ERROR: %s"
也有意见,但有机会返工:
if code == 200 then
if member "usage_type" json <> `Null then
let usage_type = json |> member "usage_type" |> to_string in
printf "usage_type: %s\n" usage_type
else
printf
"ERROR: The usage_type field requires a paid subscription to the \
Starter plan or higher."
else if (code == 400 || code == 401) && member "error" json <> > `Null then
let error_message =
json |> member "error" |> member "error_message" |> to_string
in
printf "ERROR: " ^ error_message
else printf "HTTP Code: " ^ Int.to_string code )
使用模式匹配和条件保护:
match code with
| 200 when member "usage_type" json <> `Null ->
json
|> member "usage_type"
|> to_string
|> printf "usage_type: %s\n"
| 200 ->
printf
"ERROR: The usage_type field requires a paid subscription to the \
Starter plan or higher."
| (400 | 401) when member "error" json <> `Null ->
json
|> member "error"
|> member "error_message"
|> to_string
|> printf "ERROR: %s"
| _ -> printf "HTTP Code: %d" code