【发布时间】:2017-07-14 02:59:15
【问题描述】:
我刚刚开始学习 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 行,我在获得此解决方案时遇到了很多麻烦。出于某种原因,除非我使用the Nat 明确类型,否则这不会进行类型检查。错误状态:
Can't disambiguate since no name has a suitable type:
Prelude.List.length, Prelude.Strings.length
这对我来说没有多大意义,因为无论使用length 的哪个定义,返回类型都是Nat。这得到了这样一个事实的支持,即在 REPL 中可以无错误地完成相同的操作序列。这是什么原因?
【问题讨论】:
标签: functional-programming type-conversion type-inference idris