OCaml中的一元减号和浮点数

Pte*_*mys 4 syntax ocaml

我希望在我的程序中有一个复数的向量,所以我写了这个:

[|pt 0. 0.; pt -4. 1.; pt -7. -2.; pt 4. 5.; pt 1. 1.|]
Run Code Online (Sandbox Code Playgroud)

pt是类型的功能float -> float -> Complex.t.但ocaml拒绝编译这句话:

Characters 12-14:
  [|pt 0. 0.; pt -4. 1.; pt -7. -2.; pt 4. 5.; pt 1. 1.|];;
              ^^
Error: This expression has type float -> float -> Complex.t
       but an expression was expected of type int
Run Code Online (Sandbox Code Playgroud)

我想在这里做的是(显然)包括复数,其实部为-4,其虚部为1.但是ocaml我将其作为一个函数的一元减去处理int -> int ->int.

我该怎么写才能做我想做的事情?

Jef*_*eld 12

这是我认为它的方式(阅读文档和实验后).真的有四个完全不同的运营商:

-    Integer subtraction        int -> int -> int
-.   Floating subtraction       float -> float -> float
~-   Integer unary negation     int -> int
~-.  Floating unary negation    float -> float
Run Code Online (Sandbox Code Playgroud)

如果每个人都使用这些操作符,事情就会很清楚,但不幸的是它也是一个非常笨拙的符号.根据我的经验,很少使用~-~-.操作员.指定OCaml语法是为了让您使用减法运算符作为一元否定运算符,就像在许多其他语言中一样.如果这样做,通常需要使用额外的括号.如果您愿意使用特定的一元运算符,则不需要括号.

即,你可以写(如在pad的编辑答案中):

[|pt 0. 0.; pt ~-.4. 1.; pt ~-.7. ~-.2.; pt 4. 5.; pt 1. 1.|]
Run Code Online (Sandbox Code Playgroud)

或者你可以写:

[|pt 0. 0.; pt (-.4.) 1.; pt (-.7.) (-.2.); pt 4. 5.; pt 1. 1.|]
Run Code Online (Sandbox Code Playgroud)

还有一个额外的混淆因素,即OCaml词法分析器被指定为当你使用浮点常量时,允许你使用整数减法运算符进行一元否定.同样,这使得符号更像其他语言.因为它基本上是一个二元运算符,所以你也需要括号.

这意味着你可以写:

[|pt 0. 0.; pt (-4.) 1.; pt (-7.) (-2.); pt 4. 5.; pt 1. 1.|]
Run Code Online (Sandbox Code Playgroud)

此表示法仅适用于负浮动常量.其他两个符号适用于您可能想要否定的任何表达式.

# (-) ;;
- : int -> int -> int = <fun>
# (-.) ;;
- : float -> float -> float = <fun>
# (~-) ;;
- : int -> int = <fun>
# (~-.) ;;
- : float -> float = <fun>

# let f x = x +. 2.0;;
val f : float -> float = <fun>

# f ~-.5.;;
- : float = -3.

# f -.5.;;
Characters 0-1:
  f -.5.;;
  ^
Error: This expression has type float -> float
       but an expression was expected of type float
# f (-.5.);;
- : float = -3.

# f -5.;;
  ^
Error: This expression has type float -> float
       but an expression was expected of type int
# f (-5.);;
- : float = -3.
Run Code Online (Sandbox Code Playgroud)