Syntax OCaml中的一元负数和浮点数
我想在我的程序中有一个复数向量,所以我写了这个:Syntax OCaml中的一元负数和浮点数,syntax,ocaml,Syntax,Ocaml,我想在我的程序中有一个复数向量,所以我写了这个: [|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 expressio
[|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
的函数处理
我应该写些什么来做我想做的事?以下是我的想法(在阅读文档和实验之后)。实际上有四种完全不同的操作员:
- 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 lexer被指定为允许您在与浮点常量一起使用整数减法运算符进行一元求反。同样,这使得符号更像其他语言。因为它基本上是一个二进制运算符,所以这里也需要括号
这意味着您可以编写:
[|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.|]
此表示法仅适用于负浮动常数。其他两个符号适用于您可能要求反的任何表达式
# (-) ;;
- : 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.
#(-);;
-:int->int->int=
# (-.) ;;
-:浮动->浮动->浮动=
# (~-) ;;
-:int->int=
# (~-.) ;;
-:浮动->浮动=
#设fx=x+。2.0;;
val f:浮动->浮动=
#f~-.5。;;
-:float=-3。
#f-.5。;;
字符0-1:
f-.5。;;
^
错误:此表达式的类型为float->float
但应为float类型的表达式
#f(-.5.);;
-:float=-3。
#f-5。;;
^
错误:此表达式的类型为float->float
但表达式应为int类型
#f(-5。);;
-:float=-3。
很好地澄清了语法/词法分析器与提供一元否定的函数之间的区别,以及-
的中缀表示。这通常会给刚开始工作的人带来很多困惑。谢谢!(为了充分披露,“-5.”的处理实际上发生在解析器中,但我认为它本质上是一种词法解释。)不符合浮点文本的词法约定(如果您查看parser.y,您将看到实现前导(-)的规则关于花车。我几个月前查过了。但就连INRIA的人似乎也把它记录为一个词汇。可能是一个小细节。很有趣,谢谢。)哈,很有趣。谢谢你的澄清。