我希望在我的程序中有一个复数的向量,所以我写了这个:
[|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)