我意识到这可能是一个愚蠢的问题,但......
如果我链接了一堆let里面做陈述并不需要知道对方的价值观,是它更好地使用and或in?
例如,如果有的话,哪一个更可取:
let a = "foo"
and b = "bar"
and c = "baz"
in
(* etc. *)
Run Code Online (Sandbox Code Playgroud)
要么
let a = "foo" in
let b = "bar" in
let c = "baz"
in
(* etc. *)
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我,前者应该"更好"(通过对"更好"的非常小的定义),因为它创造了必要的最小范围,而后者是范围内的范围.编译器/解释器注意的范围,但最终是不重要和不必要的深度.
我一般不知道如何实现这一点,但为了清楚起见,我会特别询问一个例子:
Sexplib看起来很有趣.我想玩它.我已经下载了它,安装得很好(我很确定,无论如何)等等.我想在顶层使用"with sexp"语法扩展.我该怎么做呢?我发现它使用的所有示例都假设您已经知道如何使用语法扩展进行顶层和/或编译.
我最好的拍摄是这样的:
ocamlmktop -I +site-lib/sexplib -pp "camlp4 -I +site-lib/sexplib pa_sexp_conv.cma" -o sexplib-top
Run Code Online (Sandbox Code Playgroud)
当我运行这个toplevel时,我可以open Sexplib很好,但是当我尝试使用with sexp语法扩展时,我得到一个语法错误.
假设我有以下数据类型:
data Foo = Foo { field1, field2, field3 :: Int }
Run Code Online (Sandbox Code Playgroud)
我想使它的一个实例Ord,通过比较field1,field2以及field3以特定的顺序.
我觉得写起来很烦人:
-- (we need Eq Foo to define Ord Foo)
instance Eq Foo where
x == y = all id [ f x == f y
| f <- [field1, field2, field3] ]
instance Ord Foo where
compare x y = case (comparing field1) x y of
EQ -> case (comparing field2) x y of
EQ -> (comparing field3) …Run Code Online (Sandbox Code Playgroud) 假设我有一个像这样的简单函数:
int all_true(int* bools, int len) {
if (len < 1) return TRUE;
return *bools && all_true(bools+1, len-1);
}
Run Code Online (Sandbox Code Playgroud)
这个函数可以用更明显的尾递归样式重写,如下所示:
int all_true(int* bools, int len) {
if (len < 1) return TRUE;
if (!*bools) return FALSE;
return all_true(bools+1, len-1);
}
Run Code Online (Sandbox Code Playgroud)
从逻辑上讲,两者之间没有差别; 假设bools只包含TRUE或FALSE(明智地定义),它们完全相同.
我的问题是:如果编译器足够智能以优化第二个作为尾递归调用,那么假设它以相同的方式优化第一个是合理的,假设"&&"短路?显然,如果使用非短路运算符,这将不是尾递归的,因为两个表达式都会在运算符被应用之前进行求值,但我对短路情况感到好奇.
(在我收到大量评论告诉我C编译器通常不优化尾递归调用之前:考虑这是一个关于使用短路运算符优化尾递归调用的一般性问题,不依赖于语言.我将是很高兴在Scheme,Haskell,OCaml,F#,Python中重写这个,或者如果你不理解C,那么你还有什么其他的东西.)
recursion tail-recursion short-circuiting compiler-optimization
我意识到这个问题有点微不足道,但我有兴趣知道"正确"的答案.
我正在尝试扩展,
但我的任务不需要任何参数.android.os.AsyncTask<Params, Progress, Result>
鉴于我必须超载protected Result doInBackground(Params... params),
没有参数传递的"最佳"方法是什么?
目前,我正在使用它Object作为Params类型并开始执行任务:
new MyAsyncTask().execute( (Object)null );
这是完全正常的,但我是Java的新手,并且不知道这是否是完成我正在尝试做的事情的好方法.
很显然,我不能把类似void或null在该Params领域,但如果我使用通配符我不确定该怎么办的参数doInBackground(Params... params).
有什么建议?
假设我想在/ dev/zero的精神中创建一个文件/ dev/7,无论何时读取它都会产生字符'7'.我应该怎么做这样的事情?我需要修改内核吗?
产生问题的示例代码:
import std.stdio, core.thread;
void main() {
ThreadGroup tg = new ThreadGroup();
foreach (int i; 1 .. 5)
tg.create( () => writeln(i) );
tg.joinAll();
}
Run Code Online (Sandbox Code Playgroud)
样本输出:
3
5
5
5
5
Run Code Online (Sandbox Code Playgroud)
(预期输出为整数1到5)
我不明白为什么会发生这种情况 - i不是引用类型,也没有引用它在委托中使用,所以为什么每个线程使用的值i作为线程所在的任何值预定的,而不是它给出的大概传值值?
我做了一些这样的蹩脚尝试,但没有成功:
foreach (int i; 1 .. 5) {
scope j = i;
tg.create( () => writeln(j) );
}
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么这不起作用.是不是j每次都宣布新鲜的?为什么每个线程引用相同的j(在线程调度时它的值通常为5)?
如果我有一组我希望能够按名称查找的对象,我当然可以使用{ string => object }地图.
是否有理由使用对象矢量和{ string => index into this vector }伴随地图?
多年来我见过许多开发人员这样做,而且我在很大程度上认为这表明开发人员不熟悉地图,或者其他方面感到困惑.但是最近几天,我开始自我猜测,我担心我可能会错过一个潜在的优化或者其他什么,虽然我不能为我的生活找出可以优化的东西.