【发布时间】:2011-05-19 02:33:03
【问题描述】:
在 Clojure[1] 中编写惯用的函数式代码,如何编写一个用空格分割字符串但保持引用短语完整的函数?一个快速的解决方案当然是使用正则表达式,但如果没有它们,这应该是可能的。乍一看,似乎很难!我用命令式语言写过类似的东西,但我想看看函数式递归方法是如何工作的。
快速检查一下我们的函数应该做什么:
"Hello there!" -> ["Hello", "there!"]
"'A quoted phrase'" -> ["A quoted phrase"]
"'a' 'b' c d" -> ["a", "b", "c", "d"]
"'a b' 'c d'" -> ["a b", "c d"]
"Mid'dle 'quotes do not concern me'" -> ["Mid'dle", "quotes do not concern me"]
我不介意引号之间的间距是否发生变化(因此可以先使用空格进行简单分割)。
"'lots of spacing' there" -> ["lots of spacing", "there"] ;is ok to me
[1] 这个问题可以笼统地回答,但我想 Clojure 中的函数式方法可以轻松地转换为 Haskell、ML 等。
【问题讨论】:
-
在带有“中间引号”的示例中,我注意到一个单引号被完全省略了。这是故意的吗?
-
故意的。我对这个问题的看法是,只有单词的开头和结尾才重要。不知道是否实用……
-
我想一个好的方法是首先将字符串拆分为类似于 Python 的
split的空格。这应该几乎是微不足道的。然后,您可能会在列表中查找以撇号开头的任何单词,如果找到,请继续查找,直到找到以撇号结尾的单词,然后合并您移过的元素。有点…… -
Deniz:我的命令式方法使用了这种方法。我正在草拟一个递归解决方案,但不知道这是否可行...
标签: recursion functional-programming clojure