为什么Idris要求函数按照其定义的顺序出现,并使用mutual
声明相互递归?
我希望Idris在函数之间执行依赖性分析的第一遍,并自动重新排序。我一直相信Haskell会这样做。为什么在伊德里斯这不可能?
答案 0 :(得分:5)
在它所说的tutorial中(强调我的):
通常,必须在使用前定义函数和数据类型,因为依赖类型允许函数 作为类型的一部分出现,以及它们减少行为以影响类型检查。但是,这个 通过使用允许数据类型和功能的相互块,可以放宽限制 同时定义。
(Agda也有这个限制,但现在removed the mutual keyword in favour of giving types then definitions。)
为了扩展这一点:当你有依赖类型时,Haskell的自动依赖性分析将是困难的或不可能的,因为类型级别的依赖顺序可能与值级别的依赖顺序不同。 Haskell没有这个问题,因为值不能出现在类型中,所以它可以只进行依赖性分析,然后按顺序进行类型检查。这就是Idris教程关于类型检查所需的值的减少行为的内容。
我不知道问题是否甚至可以通过依赖类型来解决(一方面你会失去Hindley-Milner),但我敢打赌它即使有效也不会有效。