我正在What is the monomorphism restriction?的帮助下理解单态性限制,但不理解报告第4.5.1节试图解释的内容。
声明组是相互依赖的绑定的最小集合。
什么是声明组?有人可以提供示例吗?
答案 0 :(得分:3)
想象一个程序
foo x =
let f n = g (n-1)
g n = f (n-2)
h n = 42*n
in
f (h x)
这里f
和g
构成了相互依赖的绑定的最小集合。
它们不依赖于h
,也不依赖于h
。因此我们可以将其重写为
foo x =
let h n = 42*n in
let f n = g (n-1)
g n = f (n-2)
in
f (h x)
但是我们不能将f
和g
的组分开-它们必须在一起,因为它们彼此指代对方。
在这里,f
和g
绑定都是函数绑定,所以它们是不受限制的,但是如果我们在那里有g = \n -> f (n-2)
,则意味着{ {1}}的绑定是一种简单的模式绑定,并且两者 g
和f
都将受到单态性限制。
我们可以说g
是一组绑定,但这并不是最小的绑定,因为我们可以从该组中删除h, f, g
。只有当我们不再拿出任何名称时,我们才拥有最小(即最小的大小)组。因此,如果我们重写h
,即使g = \n -> f (n-2)
,g
也将成为简单的模式绑定,受到限制,并且f
也将受到限制。的bindind是函数绑定。但是f
仍然不受影响。