声明组在上下文单态限制中是什么意思?

时间:2019-02-21 09:18:32

标签: haskell

我正在What is the monomorphism restriction?的帮助下理解单态性限制,但不理解报告第4.5.1节试图解释的内容。

  

声明组是相互依赖的绑定的最小集合。

什么是声明组?有人可以提供示例吗?

1 个答案:

答案 0 :(得分:3)

想象一个程序

foo x =
   let f n = g (n-1)
       g n = f (n-2)
       h n = 42*n
   in
      f (h x)

这里fg构成了相互依​​赖的绑定的最小集合。

它们不依赖于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)

但是我们不能将fg的组分开-它们必须在一起,因为它们彼此指代对方。

在这里,fg绑定都是函数绑定,所以它们是不受限制的,但是如果我们在那里有g = \n -> f (n-2),则意味着{ {1}}的绑定是一种简单的模式绑定,并且两者 gf都将受到单态性限制。

我们可以说g是一组绑定,但这并不是最小的绑定,因为我们可以从该组中删除h, f, g。只有当我们不再拿出任何名称时,我们才拥有最小(即最小的大小)组。因此,如果我们重写h,即使g = \n -> f (n-2)g也将成为简单的模式绑定,受到限制,并且f也将受到限制。的bindind是函数绑定。但是f仍然不受影响。