相关疑难解决方法(0)

OCaml中的IEnumerable <T>

我经常使用F#.F#中的所有基本集合都实现了IEumberable接口,因此使用SeqF#中的单个模块访问它们是很自然的.这在OCaml中是否可行?

另一个问题是,'a seq在F#是懒惰的,例如我可以创建一个序列1,以100使用{1..100}以上冗长:

seq { for i=1 to 100 do yield i }
Run Code Online (Sandbox Code Playgroud)

在OCaml中,我发现自己使用以下两种方法来解决此功能:

  1. 生成一个列表:

    let rec range a b = 
      if a > b then []
      else a :: range (a+1) b;;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或采用显式递归函数.

第一个生成额外的列表.第二个打破抽象,因为我需要使用更高阶函数(如map和)在序列级别上操作fold.

我知道OCaml库有Stream模块.但它的功能似乎非常有限,不像'a seqF#那样通用.

顺便说一句,我最近使用OCaml玩Project Euler问题.所以有很多序列操作,在命令式语言中将是具有复杂体的循环.

f# ocaml functional-programming

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

哪些OCaml库可用于惰性列表处理?

哪些OCaml库提供了惰性列表处理?我正在寻找这些方面的东西:

type 'a lazy_list = (*'*)
  | Nil
  | Cons of 'a * 'a lazy_list lazy_t

let from f = 
  let rec gen n = 
    lazy 
      (
        match f n with 
          | Some x ->
              Cons (x, gen (n + 1))
          | None ->
              Nil
      )
  in 
    gen 0
Run Code Online (Sandbox Code Playgroud)

回溯 Camlp4解析器的Stream类型和语法糖的集成将是很好的.

ocaml backtracking lazylist

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