小编Pat*_*atJ的帖子

如何使用 OCaml 的 [@tailcall] 注释来断言尾递归?

在 OCaml 中,[@tailcall]注释可以让您断言特定的函数调用是尾调用(因此希望您的整个函数是尾递归的)。问题是:我应该将注释准确放置在哪里?

明显、简单的例子:

let rec f = function
  | 0 -> 0
  | x -> (f [@tailcall]) (x - 1) (* works like a charm *)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在“不太明显”的地方做到这一点:

let rec f = function
  | 0 -> 0
  | x -> (|>) (x - 1) f (* uh? *)
Run Code Online (Sandbox Code Playgroud)

从汇编代码中我可以看到,后一个示例被编译器识别为尾递归。所以直到有人实现[@tailrec]:我到底应该在哪里放置[@tailcall]注释?(如果在第二个例子中可能的话)

ocaml tail-recursion

6
推荐指数
1
解决办法
2446
查看次数

为什么OCaml中没有函数头?

在某些编程语言中,尤其是在C语言中,存在具有函数声明的头文件.这些函数"标题"位于代码之前,并且在具有相互递归的情况下是必需的.当函数头放在头文件中时,它们还有助于链接多个C文件一起编译的情况.

我对C文件中函数头的理解是它们有助于编译,因为它们定义函数的类型,如果它在定义之前被调用.如果这是错误的,我会很高兴能够得到纠正和更好的信息,但这是我对它的理解.

所以我不明白,为什么其他语言 - 在这种情况下我单挑OCaml - 没有功能标题.在OCaml中,存在具有签名的模块,但是签名不允许您的函数实例化是相互递归的,即使给出了类型.为了在OCaml中进行相互递归,你需要使用"和"关键字,或者在另一个函数中本地定义一个函数(据我所知).

(* version 1 *)
let rec firstfun = function
  | 0 -> 1
  | x -> secondfun (x - 1)
and secondfun = function
  | 0 -> 1
  | x -> firstfun x

(* version 2 *)
let rec firstfun = function
  | 0 -> 1
  | x -> 
       let rec secondfun = function
         |0 -> 1
         | x -> firstfun x in
       secondfun (x - 1)
Run Code Online (Sandbox Code Playgroud)

那么为什么会这样呢?它与多态性有关吗?有没有我不考虑的编译瓶颈?

c ocaml programming-languages mutual-recursion

6
推荐指数
2
解决办法
403
查看次数

(int*)&var是什么意思?

是什么意思(int*) &i

  char i;
  int* p = (int*) &i;
  ...
  *p = 1234567892;
  ...
Run Code Online (Sandbox Code Playgroud)

如果是的话* &i,我会理解.但在这种情况下,这是一个" int".

c pointers

3
推荐指数
2
解决办法
1万
查看次数

这个OCaml代码如何工作?

以下OCaml代码创建了一个通用类型(不是我的,来自Jane Street的网站):

module Univ : sig
   type t 
   val embed: unit -> ('a -> t) * (t -> 'a option) 
end = struct
   type t = bool -> unit
   let embed () =
    let r = ref None in
    let put x =
     let sx = Some x in
     fun b -> r := if b then sx else None
    in
    let get f =
     f true;
     let res = !r in
     f false; res
    in
    put, get …
Run Code Online (Sandbox Code Playgroud)

ocaml

2
推荐指数
1
解决办法
101
查看次数

如何解决bundle install rake error和Gem :: RemoteFetcher :: FetchError

当我bundle install在ruby 2.1.2上运行时,我得到:

Gem::RemoteFetcher::FetchError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://rubygems.org/gems/rake-10.4.2.gem)
An error occurred while installing rake (10.4.2), and Bundler cannot continue.
Make sure that `gem install rake -v '10.4.2'` succeeds before bundling.
Run Code Online (Sandbox Code Playgroud)

当我跑步时,gem install rake我得到:

ERROR:  Could not find a valid gem 'bundle' (>= 0), here is why:
      Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
Run Code Online (Sandbox Code Playgroud)

当我跑步时,which bundle我得到: …

ruby gem rubygems ruby-on-rails ruby-on-rails-3

1
推荐指数
1
解决办法
9297
查看次数

如何访问传递给OCaml中另一个文件中的函数的记录类型元素?

在我对学习的探索中,OCaml我不了解如何访问存储在传递给另一个文件中的函数的记录类型中的值.

我目前的代码:

main.ml 文件

(* Declaring a token record type*)
type 'a tokens = { 
                   error_tok : 'a;
                   id_tok    : 'a;          
                 }

let main_fun () =                   
                let token = { 
                              error_tok = -1;
                              id_tok    =  0;           
                            } in

               let tok = Rdp.rdp token in
                         print_int tok;

;;

main_fun ();
Run Code Online (Sandbox Code Playgroud)

rdp.ml 文件

let rdp token = print_string "In RDP function: \n";                  
                print_int token.error_tok;
                0;
Run Code Online (Sandbox Code Playgroud)

我正在编译使用ocamlbuild main.native并获得编译错误Unbound record field error_tok.我如何访问存储token.error_tok在我rdp.ml文件中的传入记录类型中的值.

本质上,我试图将记录类型视为一种enum …

ocaml

0
推荐指数
1
解决办法
183
查看次数