Functional programming 为什么';这是没有显式类型的Idris代码段类型检查吗?

Functional programming 为什么';这是没有显式类型的Idris代码段类型检查吗?,functional-programming,type-conversion,type-inference,idris,Functional Programming,Type Conversion,Type Inference,Idris,我刚刚开始学习Idris,我正在使用Idris进行图书类型驱动的开发。第二章中的一个示例练习是编写一个函数,给定一个字符串,该函数确定该字符串中单词的平均长度。我的解决办法如下: average : String -> Double average phrase = let werds = words phrase numWords = length werds numChars = the Nat (sum (map length werds)) in c

我刚刚开始学习Idris,我正在使用Idris进行图书类型驱动的开发。第二章中的一个示例练习是编写一个函数,给定一个字符串,该函数确定该字符串中单词的平均长度。我的解决办法如下:

average : String -> Double
average phrase =
  let werds = words phrase
      numWords = length werds
      numChars = the Nat (sum (map length werds)) in
  cast numChars / cast numWords
然而,由于
numChars
行的原因,我很难找到这个解决方案。出于某种原因,除非我使用Nat使类型显式化,否则这不会进行类型检查。错误状态为:

Can't disambiguate since no name has a suitable type:
        Prelude.List.length, Prelude.Strings.length

这对我来说没有多大意义,因为无论使用的是
length
的哪个定义,返回类型都是
Nat
。这一点得到了以下事实的支持:相同的操作序列可以在REPL中无错误地完成。这是什么原因?

这确实是一个奇怪的问题,因为如果您命名中间计算
映射长度werds
,那么Idris能够推断出类型:

average : String -> Double
average phrase =
  let werds    = words phrase
      numWords = length werds
      swerds   = map length werds
      numChars = sum swerds in
  cast numChars / cast numWords

REPL还可以推断出
sum。地图长度。单词具有类型
字符串->Nat
。如果您在这里没有得到满意的答案,我建议您归档。

这是一个实现错误。Idris是用Haskell而不是Idris本身编写的。由于Haskell没有依赖类型,因此更可能出现bug。也许有一天,Idris本身会被改写