小编von*_*aka的帖子

OCaml的直肠推断

虽然-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)

那么,有人可以详细说明这个话题吗?

ocaml

6
推荐指数
1
解决办法
175
查看次数

K&amp;R C 编程语言练习 2-9

我不明白 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,我哪里错了?

另外,练习中提到了补码,这和这个问题有关系吗?

多谢!!!

c

2
推荐指数
1
解决办法
1258
查看次数

死锁与匿名互斥和结构

假设我有这两种结构:

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.但我不知道为什么这很重要.有人可以解释一下这种行为吗?

https://play.golang.org/p/UVi_WLWeGmi

struct mutex deadlock embedding go

-1
推荐指数
1
解决办法
119
查看次数

为什么const初始化器不能为nil?

我的类型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

当然,我可以接受这一点,并以多种不同的方式重构程序。但是我仍然想知道为什么不可能初始化constnil?一定有架构上的原因,但我看不到。

(请注意,我更喜欢“重命名”,nil而不是直接使用它,原因仅在于该名称nil对我而言不是很直观)。

go

-2
推荐指数
1
解决办法
160
查看次数

有没有办法匹配所有接口?

当结构体实现多个接口时,在函数中匹配所有接口的最简单方法是什么?

走的路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 也无济于事。那么有没有办法检查多个接口?

go

-3
推荐指数
1
解决办法
64
查看次数

标签 统计

go ×3

c ×1

deadlock ×1

embedding ×1

mutex ×1

ocaml ×1

struct ×1