假设一个函数bind
有一个带标签的参数,可选参数和未标记的参数,并且你想要定义一个m
应用未标记参数的方法bind
并返回部分应用的函数,以便用户m
可以应用标记或可选参数bind
.你怎么做到这一点?简单编写method m = bind a b [...] z
会导致编译器认为省略了可选参数.
我在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) 我希望在我的程序中有一个复数的向量,所以我写了这个:
[|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
.
我该怎么写才能做我想做的事情?
我正在按照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
我们s
是通过由插座的文件描述符socket(PF_INET, ...)
.
如果我打电话accept(s, (struct sockaddr *) &addr, ...)
,哪里addr
是类型struct sockaddr_in
,我可以假设返回地址的格式是IPv4,即,
addr.sin_family == AF_INET
?
我有很多事情将结果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"的正确方法是什么?
我想编写一个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上工作.