为什么伊德里斯需要相互的?

时间:2014-11-01 18:30:48

标签: idris

为什么Idris要求函数按照其定义的顺序出现,并使用mutual声明相互递归?

我希望Idris在函数之间执行依赖性分析的第一遍,并自动重新排序。我一直相信Haskell会这样做。为什么在伊德里斯这不可能?

1 个答案:

答案 0 :(得分:5)

在它所说的tutorial中(强调我的):

  

通常,必须在使用前定义函数和数据类型,因为依赖类型允许函数   作为类型的一部分出现,以及它们减少行为以影响类型检查。但是,这个   通过使用允许数据类型和功能的相互块,可以放宽限制   同时定义。

(Agda也有这个限制,但现在removed the mutual keyword in favour of giving types then definitions。)

为了扩展这一点:当你有依赖类型时,Haskell的自动依赖性分析将是困难的或不可能的,因为类型级别的依赖顺序可能与值级别的依赖顺序不同。 Haskell没有这个问题,因为值不能出现在类型中,所以它可以只进行依赖性分析,然后按顺序进行类型检查。这就是Idris教程关于类型检查所需的值的减少行为的内容。

我不知道问题是否甚至可以通过依赖类型来解决(一方面你会失去Hindley-Milner),但我敢打赌它即使有效也不会有效。