我想在我的程序中有一个复数的向量,所以我写了这个:
[|pt 0. 0.; pt -4. 1.; pt -7. -2.; pt 4. 5.; pt 1. 1.|]
此处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
我想在这里做的是(显然)包括复数,其实部为-4,其虚部为1.但是ocaml
将我想要的一元减去处理为类型的函数int -> int ->int
。
我应该写什么来做我想做的事?
答案 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.