Functional programming 为什么';这是没有显式类型的Idris代码段类型检查吗?
我刚刚开始学习Idris,我正在使用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
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本身会被改写