OCaml中的一元减号和浮点数

时间:2012-01-24 09:43:32

标签: syntax ocaml

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

[|pt 0. 0.; pt -4. 1.; pt -7. -2.; pt 4. 5.; pt 1. 1.|]

此处ptfloat -> 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

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

我应该写什么来做我想做的事?

1 个答案:

答案 0 :(得分:12)

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

-    Integer subtraction        int -> int -> int
-.   Floating subtraction       float -> float -> float
~-   Integer unary negation     int -> int
~-.  Floating unary negation    float -> float

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

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

[|pt 0. 0.; pt ~-.4. 1.; pt ~-.7. ~-.2.; pt 4. 5.; pt 1. 1.|]

或者你可以写:

[|pt 0. 0.; pt (-.4.) 1.; pt (-.7.) (-.2.); pt 4. 5.; pt 1. 1.|]

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

这意味着你可以写:

[|pt 0. 0.; pt (-4.) 1.; pt (-7.) (-2.); pt 4. 5.; pt 1. 1.|]

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

# (-) ;;
- : 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.