【发布时间】:2016-02-01 19:37:43
【问题描述】:
我正在尝试编写 Martin Odersky 的函数式编程课程中第 6.7 课的 clojure 版本。原版是用 Scala 编写的。
这个概念是获取一个电话号码(作为一个字符串)并在给定单词字典的情况下生成一个可能的短语列表。
因此,translate("7225247386") 会产生短语“Scala 很有趣”
这是Gist with the full Scala version。
最终的“编码”函数出现问题 Scala 版本是
def encode(number: String): Set[List[String]] =
if (number.isEmpty) Set(List())
else {
for {
split <- 1 to number.length
word <- wordsForNum(number take split)
rest <- encode(number drop split)
} yield word :: rest
}.toSet
使用我的 Clojure 版本
(defn encode
"Takes a number as a string. Returns all the different ways to encode that number as a list of words"
[number]
(if (empty? number)
(vector)
(for [split (range 0 (count number))
word (words-from-number (subs number 0 split))
remainder (encode (subs number split))]
(concat word remainder))))
问题似乎是字符串不断转换为字符列表;这就是为什么我使用(subs number 0 split) 而不是(take split number)
上面的一个版本只找到第一个单词似乎是在正确的轨道上......
(defn encode
[number]
(for [split (range 0 (count number))
word (words-from-number (subs number 0 split))]
word))
(encode "7225247386") => ("pack" "rack" "sack" "Scala")
...但是用剩余的数字字符串添加对“编码”的递归调用只会返回一个空列表。
任何建议将不胜感激。
谢谢。
【问题讨论】:
标签: clojure list-comprehension clojurescript