我正试图建立一个ocaml环境,并且我遵循了Real World Ocaml beta附录A中的说明.我设置了opam,并在命令中安装了ocaml版本
$ opam switch 4.01.0dev+trunk
Run Code Online (Sandbox Code Playgroud)
过得很好.然后我做了一个
$ eval `opam config env`
Run Code Online (Sandbox Code Playgroud)
引入变化.我正在运行正确的顶级,如
$ which ocaml
Run Code Online (Sandbox Code Playgroud)
输出
/home/bryan/.opam/4.01.0dev+trunk/bin/ocaml
Run Code Online (Sandbox Code Playgroud)
我使用命令从Jane street安装了Core包
$ opam install core
Run Code Online (Sandbox Code Playgroud)
ocamlfind和opam搜索都显示包已正确安装.但是,当我尝试从repl或文件中打开它时,我收到错误'unbound module Core'.例如
$ ocaml
# open Core;;
Error: Unbound module Core
Run Code Online (Sandbox Code Playgroud)
这里有什么我想念的吗?为什么ocaml找不到我安装的模块?提前致谢.
据我所知,在emacs中,没有办法在C++中自定义模板列表的结束'>'字符的缩进级别.目前我的emacs缩进方案执行此操作:
template <
typename T1,
typename T2,
typename T3
>
class X;
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的:
template <
typename T1,
typename T2,
typename T3
>
class X;
Run Code Online (Sandbox Code Playgroud)
将indent变量template-args-cont设置为零将正确缩进'>'字符,但代价是unindenting模板参数列表的实际主体.
来自emacs大师的任何建议吗?
编辑:
我有点使用以下hack:
(defun indent-templates (elem)
(c-langelem-col elem t)
(let ((current-line
(buffer-substring-no-properties
(point-at-bol) (point-at-eol))))
(if (string-match-p "^\\s-*>" current-line)
0
'+)))
Run Code Online (Sandbox Code Playgroud)
然后在我的自定义主题中将template-args-cont设置为indent-templates,ala:
(c-add-style "my-style"
'("stroustrup"
;; ... Other stuff ...
(template-args-cont . indent-templates))))
Run Code Online (Sandbox Code Playgroud)
但它仍然很漂亮.它大部分时间都可以工作,但有时emacs会因为认为模板列表是arglist而感到困惑,然后就会出现欢闹.
这是一个普遍的问题,与任何一段代码无关.
假设您有一个T a可以给出实例的类型Monad.由于每个单子是Applicative通过分配pure = return和(<*>) = ap,然后每一个应用性是Functor通过fmap f x = pure f <*> x,是它更好地定义你的情况Monad,然后再平凡给出T的实例Applicative和Functor?
对我来说感觉有点落后.如果我在做数学而不是编程,我会认为我会先显示我的对象是一个仿函数,然后继续添加限制,直到我也将它显示为monad.我知道Haskell只是受到类别理论的启发,显然在构建证明时使用的技术不是编写有用程序时会使用的技术,但我想从Haskell社区获得意见.从Monad下往上更好Functor吗?或从Functor最多Monad?
我现在正在阅读C++ 14的标准草案,也许我的法律术语有点生疏,但我找不到允许初始化如下所示
std::array<int, 3> arr{1,2,3};
Run Code Online (Sandbox Code Playgroud)
合法.(编辑:显然上面是C++ 11中的合法语法.)目前在C++ 11中我们必须将std :: array初始化为
std::array<int, 3> arr{{1,2,3}}; // uniform initialization + aggregate initialization
Run Code Online (Sandbox Code Playgroud)
要么
std::array<int, 3> arr = {1,2,3};
Run Code Online (Sandbox Code Playgroud)
我以为我听说他们在C++ 14中放松了规则,所以我们在使用统一初始化时不必使用双括号方法,但我找不到实际的证据.
注意:我关心这个的原因是因为我目前正在开发一个multi_array类型,并且不想像它一样初始化它
multi_array<int, 2, 2> matrix = {
{{ 1, 2 }}, {{ 3, 4 }}
};
Run Code Online (Sandbox Code Playgroud) 我正在阅读Lambda-Cube,我对System F-omega特别感兴趣,它允许"类型操作符",即类型取决于类型.这听起来很像GHC的类型系列.例如
type family Foo a
type instance Foo Int = Int
type instance Foo Float = ...
...
Run Code Online (Sandbox Code Playgroud)
其中实际类型取决于类型参数a.我是否认为类型族是ala系统F-omega类型的一个例子?还是我在左外野?
以下代码片段不会在gcc4.6.1下编译:
template <typename... TS>
void do_stuff(TS... ts)
{
auto f = [](TS... things) { };
}
Run Code Online (Sandbox Code Playgroud)
它会抛出一个错误,指出包装没有扩展.但是,以下代码可以编译:
template <typename... TS>
void do_stuff(TS... ts)
{
auto f = [](TS... things...) { };
}
Run Code Online (Sandbox Code Playgroud)
注意参数列表中的内容之后的额外解包操作符.我从未见过在声明过程中必须扩展可变背包的情况.所以我向你们提出的问题是:
这是合法的C++ 0x语法(编译的代码片段)还是在处理可变参数类型时它只是与GCC的怪癖?
我主要是C++程序员,我已经习惯了具有类似于类模板std::unique_ptr,std::shared_ptr表达我的对象的所有权等.Delphi的标准库中是否有类似的东西?在编写代码时,是否有任何表达对象所有权的最佳实践?
编辑:由于C++ 11成为标准,有两个轻量级助手类,std::shared_ptr和std::unique_ptr.
如果我创建一个类型的变量std::shared_ptr<int>,它表示一个指向具有共享所有权的int的指针:引擎计数引用,当引用计数达到零时,指针将自动释放.这种类型表示一种"共享所有权",其中许多对象共同负责在完成资源时销毁资源.
相反,std::unique_ptr表达单一所有权.当unique_ptr超出范围时,将自动释放资源.std :: unique_ptr无法复制:一次只能有一个对象拥有此资源,并且只有一个对象负责清理对象.
将这些轻量级类与一个指向int的裸指针进行对比,它可以表示共享所有权,唯一所有权,或者它可以只是对其他地方的对象的引用!类型告诉你什么.
我的问题是:由于Delphi支持对对象的引用,是否有任何机制可以明确说明"我是这个对象的唯一所有者,当我完成它时,我会释放它",vs"我只是保留一个引用此对象以便与它进行交互,但是其他人会清理它"vs"我与许多其他对象共享此对象,并且最后拥有它的任何人都可以清理它."
我知道Collections.Generics有不同的集合,比如TListvs TObjectList,其中TObjectList将释放存储在其中的成员,但TList不会.你可以说TObjectList"拥有"它的元素,而TList则没有.这是我的问题的本质,真的.在设计我自己的课程时,有没有办法在语言中直接表达这些所有权问题?或者是否有开发人员常见的最佳实践/命名约定?
有没有办法在没有实际重命名组的情况下更改GNUS中组显示的名称?我从IMAP服务器上读取了我的电子邮件,组名非常难看(例如nnimap + uwindsor:INBOX.)我尝试使用该命令gnus-group-rename-group但尝试更改实际服务器上的名称.有没有办法简单地将实际名称映射到一些本地显示名称,以使我的组缓冲区更具可读性?
如果我在系统上运行emacs作为守护进程,我可以使用emacsclient轻松连接到它.我知道.但是,我想知道的是,如果守护程序已在运行,有没有办法告诉emacs(而不是emacsclient)表现得像emacsclient?
例如
# emacs daemon is not running
emacs # should start a new frame
# ...
# emacs daemon IS running
emacs # should actually behave like emacsclient, i.e. connect to my daemon
Run Code Online (Sandbox Code Playgroud)
我能为init.el做些什么来复制这种行为吗?
说我有以下类型类
class Silly (t :: * -> *) where
-- details
Run Code Online (Sandbox Code Playgroud)
我希望能够表达以下约束,但我不确定它是否可能.
class (Silly s) => Willy (s t) where
-- details
Run Code Online (Sandbox Code Playgroud)
基本上我想对类型构造函数设置约束,而不是整个类型.这甚至可以表达吗?我甚至不确定这种约束会被称为什么,所以谷歌一直没有帮助.
编辑:我有一个数据类型
data Reasoner logic atoms a = Reasoner { unReasoner :: MassAssignment atoms -> a }
Run Code Online (Sandbox Code Playgroud)
有一个Applicative实例.我最初有一个run函数,以便使这些Reasoners更容易,但由于我想利用应用程序的自由可组合性,我定义了一个包含的类型run,ala
class RunReasoner r where
type MassType r
type ResultType r
run :: r -> MassType r -> ResultType r
Run Code Online (Sandbox Code Playgroud)
具有以下实例
instance RunReasoner (Reasoner l as a) where
type MassType (Reasoner l as a) = …Run Code Online (Sandbox Code Playgroud)