我需要一个带有int类型键的OCaml映射,所以我使用Map.Make创建一个.然而,似乎标准模块 "仅"提供需要转换的Big_int,Int32,Int64和Nativeint等模块.所以我必须做的事情如下:
module IntMap = Map.Make(Int32)
let a_map = IntMap.add (Int32.of_int 0) "zero" IntMap.empty ;;
Run Code Online (Sandbox Code Playgroud)
...我宁愿避免或定义我自己的愚蠢的Int模块确实处理简单的int文字或值而不需要转换函数:
module Int = struct
type t = int
let compare x y = if x < y then -1 else if x > y then 1 else 0 end ;;
module IntMap = Map.Make(Int)
let a_map = IntMap.add 0 "zero" IntMap.empty ;;
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗?
我一直在阅读关于F#3.0类型提供程序(例如这里),看起来它们基于一种编译时代码生成.在这方面,我想知道他们如何与Lisp宏进行比较.似乎F#3.0类型提供程序和Lisp宏都允许用户代码在编译时执行并引入编译器可用的新类型.任何人都可以对这个问题和细微差别有所了解吗?
我有一个GitHub存储库,我决定删除它,但继续只维护我的硬盘上的本地存储.我现在离开了当地克隆的回购,保留了所有的历史,这很好.但是,仍有许多配置设置指向(现已删除)GitHub仓库.例如:
$ grep github .git/*
.git/config: url = https://github.com/foo/bar.git
.git/FETCH_HEAD:07c0bac92a829f3acb4b2f5c112de5f787f046e4 branch 'master' of https://github.com/foo/bar
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能确保我的本地仓库不包含任何悬空引用,并且我不能再向上游推送,也不能进入它?(我们如何称这样一个没有远程原点的仓库?)我不清楚要删除/更新哪些设置以及使用哪些值.
参考java.util.concurrent包和Future接口,我注意到(除非我弄错了)启动冗长任务并能够查询进度的能力仅来自SwingWorker实现类.
这引出了以下问题:
有没有办法,在非GUI,非Swing应用程序(映像控制台应用程序)中在后台启动冗长的任务,并允许其他线程检查进度?在我看来,没有理由将此功能限制在swing/GUI应用程序中.否则,我看到的唯一可用选项是通过ExecutorService :: submit返回Future对象.但是,基本Future接口不允许监视进度.
我得到以下编译消息:
[javac] ... error: incompatible types
[javac] exceptionClassHolder = new Holder<>( (new Exception()).getClass() );
[javac] ^
[javac] required: Holder<Class<? extends Exception>>
[javac] found: Holder<Class<CAP#1>>
[javac] where CAP#1 is a fresh type-variable:
[javac] CAP#1 extends Exception from capture of ? extends Exception
[javac] 1 error
Run Code Online (Sandbox Code Playgroud)
在我看来,根据信息所有应该是正确的.CAP#1确实扩展了Exception.那么如何理解上述信息呢?下面的SSCCE(最初没有发布,因为我希望在一般情况下理解错误消息本身):
class Holder<T> {
public T t;
public Holder(T t) {
this.t = t;
}
}
public class FooMain {
public static void main(String args[]) throws Exception {
Holder<Class<? extends Exception>> exceptionClassHolder;
exceptionClassHolder = …Run Code Online (Sandbox Code Playgroud) 我有一些复杂的Mocha代码,我想静态检查FlowType,为什么不呢?
下面是一个最小的repro:
/* @flow */
describe('it', function () {
it('fails', function() {
const s: number = 'flow spots this error';
});
});
Run Code Online (Sandbox Code Playgroud)
当我运行这个流,人流确实与分配临场问题string,以number这表明,该方法是工作在一定程度上.
但是,我也得到:
test/test.js:4
4: describe('it', function () {
^^^^^^^^ identifier `describe`. Could not resolve name
test/test.js:5
5: it('fails', function() {
^^ identifier `it`. Could not resolve name
Run Code Online (Sandbox Code Playgroud)
......显然Mocha测试定义是在这些函数全局可用的环境中运行的,但是查看测试文件没有什么可以让Flow检测到它.
我不确定这些问题是否与摩卡有关,但我不认为我可以自信地用更广泛的术语来构建问题,所以我的问题是:
describe或it?我正在尝试使用OCaml的模块语言(3.12.1),为模块定义仿函数和签名等等,主要是遵循OCaml手册第2章中的示例,我偶然发现了一个明显的情况我的仿函数和模块签名如何工作的心理模型是有缺陷的.我试图将我遇到的情况缩小到可能的最短代码量,所以不要问我想要完成什么,这是一个完全人为的例子来演示有问题的OCaml功能.
因此,我们有一个functor,它只提供一个标识函数'f',并由一个提供该函数输入参数类型的模块进行参数化.像我说的完全做作的例子.
module type SOMETYPE = sig type t end ;;
module Identity = functor (Type: SOMETYPE) -> struct let f (x: Type.t) = x end ;;
Run Code Online (Sandbox Code Playgroud)
鉴于上述情况,我们继续定义一个模块来提供int类型:
module IntType = struct type t = int end ;;
Run Code Online (Sandbox Code Playgroud)
..然后我们使用函子为int标识函数生成一个模块:
module IdentityInt = Identity(IntType) ;;
Run Code Online (Sandbox Code Playgroud)
确实生成的模块及其f函数的行为符合预期:
#IdentityInt.f(3) + 10 ;;
- : int = 13
Run Code Online (Sandbox Code Playgroud)
函数的心理模型是将模块作为输入和返回模块的函数,这似乎是为我们提供了正确的服务.该Identity函子预计作为输入参数签名(模块型)的模块SOMETYPE,而事实上,我们提供的模块(IntType)具有正确的签名,因此一个有效的输出模块产生(IdentityInt),其f功能行为与预期.
现在是不直观的部分.如果我们想明确提供的模块IntType确实是SOMETYPE类型的模块,该怎么办?如:
module IntType : SOMETYPE = struct type t = int end ;; …Run Code Online (Sandbox Code Playgroud) 查看此站点中的非官方OCaml语法,唯一begin出现的产品是:
Expression ::= begin Expression end
Run Code Online (Sandbox Code Playgroud)
还有一点看到:
Expression ::= ( Expression [:Type] )
Run Code Online (Sandbox Code Playgroud)
这一点,以及一些简单的代码中的begin/ end与(/ )在一些简单的代码(不影响正确性)的一些随意替换可能似乎表明begin end关键字只是语法糖.或者我错过了什么?
我已配置git为meld用作外部差异工具:
$ cat ~/.gitconfig | grep -A2 "\[diff\]"
[diff]
tool = vimdiff
external = git-meld
Run Code Online (Sandbox Code Playgroud)
......在哪里git-meld:
$ cat $(which git-meld)
#!/bin/bash
meld $2 $5
Run Code Online (Sandbox Code Playgroud)
但有时候(例如在非常小的差异或者我想从diff文本中轻松复制粘贴的东西的情况下)我只想看到shell上的差异并避免meld产生延迟.
有没有办法(例如命令行参数)覆盖.gitconfig设置并指示git只做一个简单的纯文本差异?
我的render“主要”组件中有以下内容:
import ComponentA from './component-a.js';
import ComponentB from './component-b.js';
const App = React.createClass({
render: function() {
return (
<div>
<ComponentA/>
<ComponentB/>
</div>
);
}
});
Run Code Online (Sandbox Code Playgroud)
ComponentA需要一个css文件。所以我有以下内容component-a.js:
require ('./component-a.css');
const ComponentA = React.createClass({
render: function() {
return (
<div>component a</div>
);
}
});
Run Code Online (Sandbox Code Playgroud)
......而ComponentB没有。所以我有以下内容component-b.js:
const ComponentB = React.createClass({
render: function() {
return (
<div>component b</div>
);
}
});
Run Code Online (Sandbox Code Playgroud)
(仅)css所需的文件ComponentA是:
div {
width: 100px;
height: 30px;
border: …Run Code Online (Sandbox Code Playgroud)