小编Pte*_*mys的帖子

如何在OCaml中使用可选参数来修改函数

假设一个函数bind有一个带标签的参数,可选参数和未标记的参数,并且你想要定义一个m应用未标记参数的方法bind并返回部分应用的函数,以便用户m可以应用标记或可选参数bind.你怎么做到这一点?简单编写method m = bind a b [...] z会导致编译器认为省略了可选参数.

ocaml currying

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

在OCaml中,是否可以根据Set定义Map?

我在OCaml中实现了集合(平衡搜索树)的表示.它实际上是一个Make签名的函子

module Make :
  functor (T : ORDERED_TYPE) ->
sig
  type elt = T.t
  type t
  val empty : t
  val cons : elt -> t -> t
  val delete : elt -> t -> t
  val mem : elt -> t -> bool
  val cardinal : t -> int
end
Run Code Online (Sandbox Code Playgroud)

哪里

 module type ORDERED_TYPE = sig type t val compare : t -> t -> int end
Run Code Online (Sandbox Code Playgroud)

现在我想Map在标准库中实现一个字典.它必须有像这样的签名

 module Make: functor (T : ORDERED_TYPE) -> …
Run Code Online (Sandbox Code Playgroud)

ocaml module functor

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

OCaml中的一元减号和浮点数

我希望在我的程序中有一个复数的向量,所以我写了这个:

[|pt 0. 0.; pt -4. 1.; pt -7. -2.; pt 4. 5.; pt 1. 1.|]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我想在这里做的是(显然)包括复数,其实部为-4,其虚部为1.但是ocaml我将其作为一个函数的一元减去处理int -> int ->int.

我该怎么写才能做我想做的事情?

syntax ocaml

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

在OCaml中解析Packrat(通过懒惰进行记忆)

我正在按照B. Ford硕士论文在OCaml中实现一个packrat解析器. 我的解析器应该接收一个表示语言语法的数据结构,并解析给定的符号序列.

我被记忆部分困住了.原始论文使用Haskell的惰性评估来实现线性时间复杂度.我想在OCaml中这样做(通过懒惰进行记忆),但不知道该怎么做.

那么,如何通过OCaml中的延迟评估来记忆函数?

编辑:我知道懒惰的评估是什么以及如何在OCaml中利用它.问题是如何使用它来记忆功能.

编辑:我写的代表语法的数据结构是:

type ('a, 'b, 'c) expr =
| Empty of 'c
| Term of 'a * ('a -> 'c)
| NTerm of 'b
| Juxta of ('a, 'b, 'c) expr * ('a, 'b, 'c) expr * ('c -> 'c -> 'c)
| Alter of ('a, 'b, 'c) expr * ('a, 'b, 'c) expr
| Pred of ('a, 'b, 'c) expr * 'c
| NPred of ('a, 'b, 'c) expr …
Run Code Online (Sandbox Code Playgroud)

parsing ocaml functional-programming memoization lazy-evaluation

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

如果我将IPv4地址应用到IPv4套接字,我可以假设accept(3)返回IPv4地址吗?

我们s是通过由插座的文件描述符socket(PF_INET, ...).

如果我打电话accept(s, (struct sockaddr *) &addr, ...),哪里addr是类型struct sockaddr_in,我可以假设返回地址的格式是IPv4,即,

addr.sin_family == AF_INET

unix posix network-programming ipv4 ipv6

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

用另一个函数组合函数`Printf.sprintf`

我有很多事情将结果Printf.sprintf插入到另一个函数中(比方说)f.我一直试图定义printf这两者的组成,如下所示:

let printf : 'a 'b. ('a,unit,string) format -> 'b =
  (fun fmt -> Printf.sprintf fmt) |> f
Run Code Online (Sandbox Code Playgroud)

但是,这并不是类似的,并且它的版本也没有几个应用程序Obj.magic.获得这样一个"自定义printf"的正确方法是什么?

ocaml types

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

如何在Hugs中使用GADT

我想编写一个Haskell程序,它在GHCi不支持的平台上交互使用GADT(即mipsel上的GNU/Linux).问题是,可用于在GHC中定义GADT的构造,例如:

data Term a where
    Lit :: Int ->  Term Int
    Pair :: Term a -> Term b -> Term (a,b)
    ...
Run Code Online (Sandbox Code Playgroud)

似乎没有在Hugs上工作.

  1. 不能在Hugs中定义GADT吗?我在Haskell课堂上的TA表示在Hugs中有可能,但他似乎不确定.
  2. 如果没有,可以使用Hugs支持的其他语法或语义对GADT进行编码,就像GADT可以用ocaml编码一样吗?

haskell functional-programming ghc hugs gadt

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