我在学。 这是我发现奇怪的事情:

let test_treeways x = match x with
  | _ when x < 0 -> -1
  | _ when x > 0 -> 1
  | _ -> 0;;

如果我然后这样称呼它:

test_threeways -10;;

我将得到类型不匹配错误(因为,据我所知,它解释一元减去好像它是部分函数应用程序,所以它认为表达式的类型是int -> int 。但是,这:

test_threeways (-10);;

按预期行事(虽然这实际上计算了值,但据我所知,它不会向函数传递常数“减十”。

那么,你如何在OCaml中编写常数负数?

===============>>#1 票数:8 已采纳

您需要将其括起来以避免解析歧义。 “test_threeways -10”也可能意味着:从test_threeways中减去10。

并且没有涉及功能应用程序。 只需重新定义一元减号,即可看出差异:

#let (~-) = (+) 2 ;; (* See documentation of pervarsives *)
val ( ~- ) : int -> int = <fun>
# let t = -2 ;; 
val t : int = -2 (* no function application, constant negative number *)
# -t ;;
- : int = 0   (* function application *)

===============>>#2 票数:1

你可以使用〜 -和〜 - 。 直接(如在另一个答案中暗示的),它们都是显式的前缀运算符,因此解析它们并不含糊。 但是我更喜欢使用括号。

  ask by translate from so

未解决问题?本站智能推荐:

1回复

复制OCaml中的字段

关于OCaml记录,我有一个非常基本的问题。 假设我有一个定义的记录: 现在,假设我想要创建一个新记录,其中所有字段都等于x但c = 4。 我可以写: 但这很烦人,因为不需要重写a = 3和b = 8。 我也可以写: 但如果记录有很多字段,这仍然不好。 有没有办法
1回复

OCaml共享变量

我希望创建两个函数:第一个函数生成一个新的整数,第二个函数重置生成器 REPL在最后两个分号上显示“错误:语法错误”。
1回复

OCaml语法混乱

当我第一次开始使用in语句时,我认为它非常简单并且很有意义。 但是,这些代码示例让我怀疑我对它们的理解程度。 我认为可以将其声明为fun2,然后将其应用于通过fun1获得的变量x调用fun2。 这使我更加困惑,并提出了更多问题。 我真的不知道该怎么解释。 是sum1被声明为
1回复

磅(#)在OCaml中的含义

我正在执行OCaml分配,只是窥探了分配文件,在其中发现了我认为是生成的文件。 它有很多这样的代码, 我对间隔感到抱歉,但这就是它在文件中的显示方式。 由于我真的不知道#字符是否应该像这样位于左侧,因此我只是按照显示的样子粘贴它。 # <number> <st
4回复

Ocaml语法错误

我正在使用惰性列表的实现,其中类型可以是Nil或Cons (value, thunk) ,其中thunk是从单元到列表其余部分的函数。 我正在尝试编写一个函数cross ,它将起到List.combine作用。 不幸的是,我有语法错误。 这会产生错误: 我究竟做错了什么?
1回复

OCaml比赛速记

当我第一次查看OCaml中function关键字的用法时,我得到的印象是消除模式匹配的match x with是语法糖。 但是,我看到两者之间存在签名差异,如下例所示。 您希望在什么情况下使用function示例? 第一个函数的签名为val eval1 : e -> byt
3回复

OCaml打印语句

是否可以将用于调试/测试的打印语句放在代码块中? 例如,在Java中,您可以在方法中间使用System.out.println("")来检查变量或其他内容,但是在OCaml中,像print_string这样的命令可以工作吗? 它不会返回单位类型的值,从而导致错误,而不是允许您打印它吗?
3回复

OCaml定界符和范围

我正在学习OCaml,尽管我在命令式编程语言(C,C ++,Java)方面有多年的经验,但OCaml语法中的声明或表达式之间的分隔符却出现了一些问题。 基本上我明白我必须用; 连接表达式,该序列返回的值将是最后使用的表达式之一,例如,如果我有 它将被视为返回exp3值的表达式。
1回复

Ocaml中的语法和“ in”关键字

原始代码1: 原始代码2: 我的问题是,这些语法是否正确? 如果不是,那么它/它们有什么问题,两者之间有什么区别? 谢谢!
1回复

OCaml奇怪的语法错误

好的,对不起,再次给我x)此函数应该替换由coord指定的坐标处的dt子树(它是二叉树)(例如[0; 1; 0; 0],其中0表示前进)子树nt的左边和1的对面)。 顺便说一下,子函数返回具有指定坐标的子树。 我收到语法错误 我真的不知道为什么:S反正谢谢:)