首页 > 解决方案 > 声明组在上下文单态限制中是什么意思?

问题描述

我试图在什么是单态限制的帮助下理解单态限制?但不明白,报告的第 4.5.1 节试图解释什么。

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

究竟什么是声明组?有人可以提供一个例子吗?

标签: haskell

解决方案


想象一个程序

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——他们必须一起去,因为他们每个人都指着另一个人。

这里,bothfgbinding 都是函数绑定,所以它们是unrestricted,但是如果我们g = \n -> f (n-2)有,这意味着's 绑定是一个g简单的模式绑定,并且两者 都会受到单态限制。fg

我们可以说h, f, g是一组绑定,但它不是最小的,因为我们可以h从那个组中取出。只有当我们不能再取出任何名字时,我们才有最小(即最小的)组。所以如果我们重写g = \n -> f (n-2)g就变成了简单的模式绑定,变成了受约束,和f它一起受约束,即使f'bindind 是一个函数绑定。但h仍然不受影响。


推荐阅读