虽然-rectypes在某些时候玩OCaml选项我只是输了.
这个表达式非常典型:
# fun x -> x x;;
- : ('a -> 'b as 'a) -> 'b = <fun>
Run Code Online (Sandbox Code Playgroud)
但是这里OCaml陷入了无限循环:
# (fun x -> x x) (fun x -> x x);;
C-c C-cInterrupted.
Run Code Online (Sandbox Code Playgroud)
好的,我可以理解,递归式系统是一件相当困难的事情.但首先,我真的想知道这个表达式的类型并且完全可以打字,其次,在这种情况下,我不明白OCaml如何仍然可以输入:
# fun _ -> (fun x -> x x) (fun x -> x x);;
- : 'a -> 'b = <fun>
Run Code Online (Sandbox Code Playgroud)
那么,有人可以详细说明这个话题吗?
我不明白 K&R C 编程语言第 2 章 2.10 中的练习 2-9:
练习2-9。在二进制补码系统中, x &= (x-1) 删除 x 中最右边的 1 位。解释为什么。使用此观察结果编写更快版本的 bitcount 。
位计数函数为:
/* bitcount: count 1 bits in x */
int bitcount(unsigned x)
{
int b;
for (b = 0; x != 0; x >>= 1)
if (x & 01)
b++;
return b;
}
Run Code Online (Sandbox Code Playgroud)
该函数在检查最右边的位是否为 bit-1 后将其删除,然后弹出最后一位。
我不明白为什么x&(x-1)要删除最右边的1位?例如,假设 x 是1010且 x-1 是1001二进制的,并且x&(x-1)是1011,所以最右边的位将在那里并且将是 1,我哪里错了?
另外,练习中提到了补码,这和这个问题有关系吗?
多谢!!!
假设我有这两种结构:
type A struct {
Mutex sync.Mutex
i int
}
type B struct {
A
sync.Mutex
}
Run Code Online (Sandbox Code Playgroud)
现在,当我试图锁定B然后A我遇到了僵局:
var b B
b.Lock()
b.Mutex.Lock()
b.Mutex.Unlock()
b.Unlock()
Run Code Online (Sandbox Code Playgroud)
我想通了,这是与结构的互斥体的名字相关A,例如,有是,如果我将其命名为无僵局Mutexx,而不是Mutex.但我不知道为什么这很重要.有人可以解释一下这种行为吗?
我的类型A基本上是一个简单的地图:
type A map[int32]struct{}
Run Code Online (Sandbox Code Playgroud)
现在,我想拥有这种类型的特殊价值,以便能够对其有所不同。我认为使用nil此提议会很明智(此外,通过这种方式,所有类型的所有未初始化变量都A将具有此值,这也是我想要的值):
const s A = nil
Run Code Online (Sandbox Code Playgroud)
但是我得到了
const初始化器不能为nil
当然,我可以接受这一点,并以多种不同的方式重构程序。但是我仍然想知道为什么不可能初始化const为nil?一定有架构上的原因,但我看不到。
(请注意,我更喜欢“重命名”,nil而不是直接使用它,原因仅在于该名称nil对我而言不是很直观)。
当结构体实现多个接口时,在函数中匹配所有接口的最简单方法是什么?
走的路switch工作以下功能不是一个选项。
func f(i interface{}) {
switch i.(type) {
case A:
fmt.Println("A")
case B:
fmt.Println("B")
}
}
Run Code Online (Sandbox Code Playgroud)
即使只i实现两个接口f(i)输出A。添加fallthrough 也无济于事。那么有没有办法检查多个接口?