gpt4 book ai didi

syntax - OCaml中的一元减号和 float

转载 作者:行者123 更新时间:2023-12-04 22:24:02 25 4
gpt4 key购买 nike

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

[|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类型的函数。

我该写什么去做自己想做的事?

最佳答案

这是我的看法(阅读文档并进行实验后)。确实有四个完全不同的运算符:

-    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.

关于syntax - OCaml中的一元减号和 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8984661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com