在C/C++中,您可以使用函数指针数组实现直接线程解释器.该数组代表您的程序 - 一系列操作.每个操作函数必须以调用数组中的下一个函数结束,例如:
void op_plus(size_t pc, uint8_t* data) {
*data += 1;
BytecodeArray[pc+1](pc+1, data); //call the next operation in the array
}
Run Code Online (Sandbox Code Playgroud)
该BytecodeArray是函数指针阵列.如果我们有一个这些op_plus操作的数组,那么数组的长度将决定我们如何增加数据的内容.(当然,您需要添加某种终止操作作为数组中的最后一个操作).
如何在OCaml中实现类似的功能呢?我可能试图翻译这个代码:我在C++中使用OCaml函数数组.问题在于我最终会遇到类似的问题:
let op_plus pc data = Printf.printf "pc: %d, data_i: %d \n" pc data;
let f = (op_array.(pc+1)) in
f (pc+1) (data+1) ;;
Run Code Online (Sandbox Code Playgroud)
其中op_array是在上面的作用域中定义的数组,然后稍后重新定义它以填充一堆op_plus函数...但是,op_plus函数使用op_array的先前定义.这是鸡和蛋的问题.
我正在将一些F#代码转换为OCaml,我看到了这个管道运算符的很多用途<|,例如:
let printPeg expr =
printfn "%s" <| pegToString expr
Run Code Online (Sandbox Code Playgroud)
该<|运营商显然是定义为只是:
# let ( <| ) a b = a b ;;
val ( <| ) : ('a -> 'b) -> 'a -> 'b = <fun>
Run Code Online (Sandbox Code Playgroud)
我想知道为什么他们懒得在F#中定义和使用这个操作符,是不是就这样他们可以避免像这样放入一些parens?:
let printPeg expr =
Printf.printf "%s" ( pegToString expr )
Run Code Online (Sandbox Code Playgroud)
据我所知,这将是上面的F#代码转换为OCaml,对吗?
另外,我如何在Ocaml中实现F#<<和>>运算符?
(该|>操作似乎仅仅是:let ( |> ) a b = b a ;;)
我正在将以下Haskell代码转换为OCaml:
data NFA q s = NFA
{ intialState :: q
, isAccepting :: q -> Bool
, transition :: q -> s -> [q]
}
Run Code Online (Sandbox Code Playgroud)
最初我尝试了一个非常直译:
type ('q,'s) nfa = NFA of { initialState: 'q;
isAccepting: 'q -> bool;
transition: 'q -> 's -> 'q list }
Run Code Online (Sandbox Code Playgroud)
...当然,这会产生语法错误,因为不允许使用类型构造函数部分"NFA of".它一定要是:
type ('q,'s) nfa = { initialState: 'q;
isAccepting: 'q -> bool;
transition: 'q -> 's -> 'q list }
Run Code Online (Sandbox Code Playgroud)
这让我想知道为什么会这样.为什么不能像记录类型那样拥有记录类型的类型构造函数(如下所示)?
type ('q, 's) dfa = NFA of ('q * ('q->bool) …Run Code Online (Sandbox Code Playgroud) 有一个从提案Lexifi的阿兰·弗里施在一年前的替代物camlp4写sytnax扩展利用的-ppx标志 OCaml中加入4.00.那时他提到还有一些工作要做(属性,引用等),但它已经有点用了.OCaml 4.01是否改进了对这种编写语法扩展的支持?现在有人使用这种机制而不是camlp4或camlp4仍然是为OCaml编写语法扩展的推荐方法吗?
julia> typeof(-0b111)
Uint64
julia> typeof(-0x7)
Uint64
julia> typeof(-7)
Int64
Run Code Online (Sandbox Code Playgroud)
我发现这个结果有点令人惊讶.为什么数字的数字基数确定了签名或未签名?
我在 Conv Nets 上做了很多阅读,甚至还使用了 Julia 的 Mocha.jl 包(它看起来很像 Caffe,但你可以在 Julia REPL 中使用它)。
在卷积网络中,卷积层之后是“特征图”层。我想知道的是,如何确定一个网络需要多少个特征图才能解决某个特定问题?这有什么科学依据还是更艺术?我可以看到,如果您尝试进行分类,至少最后一层应该具有特征映射数 == 类数(除非您在网络顶部有一个完全连接的 MLP,我想)。
就我而言,我不是在做分类,而是试图为图像中的每个像素提供一个值(我想这可以被视为类从 0 到 255 的分类)。
编辑:正如评论中所指出的,我正在尝试解决输出范围为 0 到 255(在这种情况下为灰度)的回归问题。尽管如此,问题仍然存在:如何确定在任何给定的卷积层上使用多少个特征图?这对于回归问题和分类问题有什么不同吗?
我有一些为Linux编写的C代码,依赖于套接字和arpa/inet.h以及libusb.h,我想在MinGW下为Windows编译.(请注意,当前项目只有一个非常简单的Makefile,并且根本不依赖于autotools).
看起来使用gnulib是一个很好的方法,能够在MinGW下为Windows编译这个并且我已经从那个方向开始了,但是看起来如果你对autotools不是很熟悉,你真的会深入杂草很快.
所以这就是我尝试过的:
$ gnulib-tool --import getsockname,getsockopt,setsockopt,socket,socketlib,sockets,socklen,sys_socket,arpa_inet,inet_ntop,inet_pton,netinet_in
Run Code Online (Sandbox Code Playgroud)
它运行并在最后给我以下消息:
Don't forget to
- add "lib/Makefile" to AC_CONFIG_FILES in ./configure.ac,
- mention "lib" in SUBDIRS in Makefile.am,
- mention "-I m4" in ACLOCAL_AMFLAGS in Makefile.am,
- mention "m4/gnulib-cache.m4" in EXTRA_DIST in Makefile.am,
- invoke gl_EARLY in ./configure.ac, right after AC_PROG_CC,
- invoke gl_INIT in ./configure.ac.
Run Code Online (Sandbox Code Playgroud)
好的,我没有configure.ac也没有Makefile.am,所以我按如下方式创建它们(按照上面的说明):
$ cat Makefile.am
SUBDIRS = lib
ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = m4/gnulib-cache.m4
Run Code Online (Sandbox Code Playgroud)
和...
$ cat configure.ac
AC_INIT([configure.ac])
AC_CONFIG_FILES([lib/Makefile])
AC_PROG_CC
gl_EARLY
gl_INIT
Run Code Online (Sandbox Code Playgroud)
现在,在这一点上,gnulib文档似乎假设您非常熟悉autotools,因此他们忽略了接下来需要对autotools做什么的所有说明.
从我从阅读各种论坛中得出的结论来看,接下来的步骤似乎是:
$ aclocal …Run Code Online (Sandbox Code Playgroud) 我希望能够获得给定OCaml程序的AST(例如,我想走AST并生成代码的检测版本或进行某种转换).任何OCaml工具都支持此功能吗?
在Javascript中有一种称为俄罗斯娃娃模式的模式(这也可称为"一次性").基本上,它是一个在某些时候取代另一个的功能.
简单的例子:
var func = function(){
func = function(){ console.log("subsequent calls call this...");};
console.log("first call");
}
Run Code Online (Sandbox Code Playgroud)
因此,第一次调用func时它将输出"first call",然后下一个(以及随后的时间)打印"后续调用调用此...".(这在Scheme中很容易做到,例如)
我一直在困惑如何在Ocaml中做到这一点?
编辑:我提出的一个解决方案:
let rec func = ref( fun () -> func := ( fun () -> Printf.printf("subsequent..\n"));Printf.printf("First..\n"));;
Run Code Online (Sandbox Code Playgroud)
被称为:!func();;
有趣的是,如果我没有在定义中包含'rec',它从不调用后续函数......它总是打印'First ...'.
我注意到包含在OpaWhiteBoard示例的源代码中,这里有一个.ml文件:https: //github.com/hhugo/OpaWhiteBoard/blob/master/src/opacairo/cairo.ml
这似乎是OCaml的一些指令("##").我猜这意味着可以在OCaml中写入Opa的扩展,对吗?