大家在scala中实际使用递归解决问题吗?

37 views
Skip to first unread message

lin qing

unread,
Jun 28, 2011, 10:37:12 PM6/28/11
to Scala中文社区
我用了半年的scala,今天第一次使用递归,消除了一个var的使用(产品代码中还有一var还在使用)。
是不是使用递归还要看个人思维方式是不是适合呢?
我的问题替换变量,原来递归那个部分是定义一个var。
原来的方式:
var inString = in.toString
styles.foreach {
(pair) =>
inString = inString.replaceAll("\\{" + pair._1.toUpperCase + "\\}",
pair._2)
}
新的方式:
def rep(str:String, xs:List[Tuple2[String, String]]): String = xs
match {
case Nil => str
case pair :: tail => rep(str.replaceAll("\\{" +
pair._1.toUpperCase + "\\}", pair._2),
tail)

}
val inString = rep(in.toString, styles)
有没有更简洁的写法呢?

完整代码:
<style type="text/css" class="lift:Css">
a:link,a:visited { text-decoration: none; color: {LINK} }
a:hover { text-decoration: underline }
body { scrollbar-base-color: {ALTBG1}; scrollbar-arrow-color:
{BORDERCOLOR}; font-size: {FONTSIZE}; {BGCODE} }
table { font-family: {FONT}; color: {TABLETEXT}; font-size:
{FONTSIZE} }
textarea,input,object { font-family: {FONT}; font-size: {FONTSIZE};
color: {TABLETEXT}; font-weight: normal; background-color: {ALTBG1} }
select { font-family: {SMFONT}; font-size: {SMFONTSIZE}; color:
{TABLETEXT}; font-weight: normal; background-color: {ALTBG1} }
.nav { font-family: {FONT}; font-size: {FONTSIZE}; font-weight:
{BOLD} }
.navtd { font-family: {FONT}; font-size: {FONTSIZE}; color:
{HEADERTEXT}; text-decoration: none }
.header { font-family: {FONT}; font-size: {SMFONTSIZE}; color:
{HEADERTEXT}; font-weight: {BOLD}; {HEADERBGCODE} }
.category { font-family: {SMFONT}; font-size: {SMFONTSIZE}; color:
{CATTEXT}; {CATBGCODE} }
.multi { font-family: {SMFONT}; font-size: {SMFONTSIZE}; color:
{LINK}; }
.smalltxt { font-family: {SMFONT}; font-size: {SMFONTSIZE} }
.mediumtxt { font-family: {FONT}; font-size: {FONTSIZE}; color:
{TEXT} }
.bold { font-weight: {BOLD} }
</style>

package code.snippet
import scala.xml._
class Css {
def render(in: NodeSeq): NodeSeq = {
val styles = Map("bgcolor" -> "bg.gif",
"altbg1" -> "#F8F8F8",
"altbg2" -> "#FFFFFF",
"link" -> "#003366",
"bordercolor" -> "#000000",
"headercolor" -> "headerbg.gif",
"headertext" -> "#FFFFFF",
"catcolor" -> "catbg.gif",
"tabletext" -> "#000000",
"text" -> "#000000",
"borderwidth" -> "1",
"tablewidth" -> "98%",
"tablespace" -> "4",
"font" -> "Tahoma, Verdana",
"fontsize" -> "12px",
"nobold" -> "0",
"boardimg" -> "logo.gif",
"imgdir" -> "images/default",
"smdir" -> "images/smilies",
"cattext" -> "#000000",
"smfontsize" -> "11px",
"smfont" -> "Arial").toList
def rep(str:String, xs:List[Tuple2[String, String]]): String = xs
match {
case Nil => str
case pair :: tail => rep(str.replaceAll("\\{" +
pair._1.toUpperCase + "\\}", pair._2),
tail)

}
val inString = rep(in.toString, styles)
val elem: Elem = net.liftweb.util.Html5.parse(inString).get
elem \\ "style"
}
}

Xuefeng Wu

unread,
Jun 29, 2011, 12:45:49 AM6/29/11
to sca...@googlegroups.com
你的问题很经典,就是把一个List展开并逐个操作,每个操作的结果作为下个操作输入。
(0  :/ List(1,2,3))(_ + _)

(inString /: styles){ (in,pair) => ( in.replaceAll("\\{" + pair._1.toUpperCase + "\\}",pair._2))}


2011/6/29 lin qing <linq...@gmail.com>

--
您收到此邮件是因为您订阅了 Google 网上论坛的“Scala中文社区”论坛。
要向此网上论坛发帖,请发送电子邮件至 sca...@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 scalacn+u...@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/scalacn?hl=zh-CN 访问此网上论坛。




--
Best Regards,
Alan Wu/吴雪峰

-----------------

Global R&D Center,Shanghai,Carestream Health
Email:xuefe...@carestreamhealth.com
Tel:(86-21)3852 6101
Rayco(Shanghai) Medical Products Co., Ltd.
锐珂(上海)医疗器材有限公司

lin qing

unread,
Jun 29, 2011, 1:30:30 AM6/29/11
to Scala中文社区
谢谢雪峰
用上你的代码了,很经典,谢谢!让我觉得fold很有价值了。
有时候很难平衡,如果写一个 :/,对其它项目成员来说会不会很难?一看到就晕了。
你的项目中怎么怎么平衡这种问题呢?

On 6月29日, 下午12时45分, Xuefeng Wu <xuefeng...@carestream.com> wrote:
> 你的问题很经典,就是把一个List展开并逐个操作,每个操作的结果作为下个操作输入。
> (0 :/ List(1,2,3))(_ + _)
>
> (inString /: styles){ (in,pair) => ( in.replaceAll("\\{" +
> pair._1.toUpperCase + "\\}",pair._2))}
>
> 2011/6/29 lin qing <linqin...@gmail.com>
> Email:xuefeng...@carestreamhealth.com

Xuefeng Wu

unread,
Jun 29, 2011, 1:47:44 AM6/29/11
to sca...@googlegroups.com
现在我的项目没几个人,不需要考虑这个问题 呵呵。

我觉得用Scala标准的API应该不是什么问题,关键是培训Scala,不会出现模糊或不可维护性。
一次理解后以后无论是读还是写效率都非常好。

但要小心自己定义的implicit,这个就跟文言文暗喻一样,外人非常难理解,要用也一定要控制使用范围。


2011/6/29 lin qing <linq...@gmail.com>

lin qing

unread,
Jun 29, 2011, 2:12:23 AM6/29/11
to Scala中文社区
我目前对DSL的理解差不多和你说的一样。
就是说Scala可以定义内部DSL,并不是说就一定要这样做,实际上定义一个DSL相对比较容易,但是这个DSL的学习,使用成本比较高。
除非项目中大量使用的,所有项目中都通用东西,每天编程都要使用的东西,可以引入现成DSL来解决,能起正面作用。引入一个偶尔使用的DSL,成本高到
不能接受;
我们大量使用Json,每天都要用,就可以使用JsonDSL;
说liftweb里面用来定义SiteMap的DSL,就是一个反面教材,首先需要配SiteMap的时候不多,另外SiteMap也不是一

常见的,大家都理解的问题,这个用DSL成本实在太高了。
这个时候我宁愿把这个DSL展开了写出来,避免每次去维护的时候,先要去学这个DSL。
总之,只有在很必要的时候,才能引入DSL。

On 6月29日, 下午1时47分, Xuefeng Wu <xuefeng...@carestream.com> wrote:
> 现在我的项目没几个人,不需要考虑这个问题 呵呵。
>
> 我觉得用Scala标准的API应该不是什么问题,关键是培训Scala,不会出现模糊或不可维护性。
> 一次理解后以后无论是读还是写效率都非常好。
>
> 但要小心自己定义的implicit,这个就跟文言文暗喻一样,外人非常难理解,要用也一定要控制使用范围。
>

> 2011/6/29 lin qing <linqin...@gmail.com>

陈近南

unread,
Jun 29, 2011, 3:32:10 AM6/29/11
to sca...@googlegroups.com
这跟DSL有啥关系?:/,:\只是foldLeft,foldRight的另一种写法而已吧,跟ele::list 一样都只是为了用着方便一点或者形象一点。
若有更多问题,请通过 http://groups.google.com/group/scalacn?hl=zh-CN 访问此网上论坛。




--
擅长苦力搬运,装卸,车工,钳工,焊工,水电工,瓦工,砸墙,砌墙,筛沙,油漆,通下水道,贴瓷砖,拆洗油烟机,拆装空调,PC游戏开发,网络游戏代练,网络维护管理,重装系统,电脑维修,三维建模,照片上色,平面设计,建筑效果图,硬件设计,电路板设计,单片机开发,四六级替考,办证,代开发票,黑枪,黑车,暗杀,洗钱,要债,算命

lin qing

unread,
Jun 29, 2011, 4:24:53 AM6/29/11
to Scala中文社区
误导你了,思维跳跃了一下, 没有表述清楚。
我在讲的其实是代码规范的问题,就是在代码中,由于要照看项目成员的学习进度,有一些技术不能使用。比如找个foldLeft,在目前项目中
我还倾向于直接写foldLeft, 而不是/:, 如果某个组员看不懂的时候,至少还可以去google foldLeft, 如果去
google /:不会有任何结果。
fold这种操作,其它语言不多见,DSL也一样,不多见,引入这样的东西一定要慎重,平衡技术带来的收益与维护成本。
不能因为某个人会用foldLeft就用,给其它人带来负担,然否?
这样表述清楚吗?

On 6月29日, 下午3时32分, 陈近南 <chf.1986.3...@gmail.com> wrote:
> 这跟DSL有啥关系?:/,:\只是foldLeft,foldRight的另一种写法而已吧,跟ele::list 一样都只是为了用着方便一点或者形象一点。

> 擅长苦力搬运,装卸,车工,钳工,焊工,水电工,瓦工,砸墙,砌墙,筛沙,油漆,通下水道,贴瓷砖,拆洗油烟机,拆装空调,PC游戏开发,网络游戏代练,网络维 护管理,重装系统,电脑维修,三维建模,照片上色,平面设计,建筑效果图,硬件设计,电路板设计,单片机开发,四六级替考,办证,代开发票,黑枪,黑车,暗杀, 洗钱,要债,算命

陈近南

unread,
Jun 29, 2011, 5:13:05 AM6/29/11
to sca...@googlegroups.com
嗯, 了解了。
不过fold这种方法倒也不是特别不常见,在groovy和ruby中, inject方法跟它作用是一样的,不过没有Left,Right,但这也简单,需要时reverse一下就行了。嗯,刚看了一下groovy的api,fuck一个,里面有个类ArrayUtil,简直就是一个奇葩,一共250个方法,都是createArray,只是参数是从0到249,难怪这哥们说早知道scala就不开发groovy了,不过不知道scala中有没有这样的代码。
擅长苦力搬运,装卸,车工,钳工,焊工,水电工,瓦工,砸墙,砌墙,筛沙,油漆,通下水道,贴瓷砖,拆洗油烟机,拆装空调,PC游戏开发,网络游戏代练,网络维护管理,重装系统,电脑维修,三维建模,照片上色,平面设计,建筑效果图,硬件设计,电路板设计,单片机开发,四六级替考,办证,代开发票,黑枪,黑车,暗杀,洗钱,要债,算命

lin qing

unread,
Jun 29, 2011, 6:42:53 AM6/29/11
to Scala中文社区
scala里面也有啊, 我想,这可能是因为所谓的工业语言和学术语言的区别吧。
在解决问题和美感之间有冲突时,先要解决问题,美感和简洁先靠后考虑。
Tuple最多22个元素,函数也是最多22个参数,系统里面写死的;
./library/scala/Tuple1.scala
./library/scala/Tuple10.scala
./library/scala/Tuple11.scala
./library/scala/Tuple12.scala
./library/scala/Tuple13.scala
./library/scala/Tuple14.scala
./library/scala/Tuple15.scala
./library/scala/Tuple16.scala
./library/scala/Tuple17.scala
./library/scala/Tuple18.scala
./library/scala/Tuple19.scala
./library/scala/Tuple2.scala
./library/scala/Tuple20.scala
./library/scala/Tuple21.scala
./library/scala/Tuple22.scala
./library/scala/Tuple3.scala
./library/scala/Tuple4.scala
./library/scala/Tuple5.scala
./library/scala/Tuple6.scala
./library/scala/Tuple7.scala
./library/scala/Tuple8.scala
./library/scala/Tuple9.scala

./library/scala/Function.scala
./library/scala/Function0.scala
./library/scala/Function1.scala
./library/scala/Function10.scala
./library/scala/Function11.scala
./library/scala/Function12.scala
./library/scala/Function13.scala
./library/scala/Function14.scala
./library/scala/Function15.scala
./library/scala/Function16.scala
./library/scala/Function17.scala
./library/scala/Function18.scala
./library/scala/Function19.scala
./library/scala/Function2.scala
./library/scala/Function20.scala
./library/scala/Function21.scala
./library/scala/Function22.scala
./library/scala/Function3.scala
./library/scala/Function4.scala
./library/scala/Function5.scala
./library/scala/Function6.scala
./library/scala/Function7.scala
./library/scala/Function8.scala
./library/scala/Function9.scala

On 6月29日, 下午5时13分, 陈近南 <chf.1986.3...@gmail.com> wrote:
> 嗯, 了解了。
> 不过fold这种方法倒也不是特别不常见,在groovy和ruby中,

> inject方法跟它作用是一样的,不过没有Left,Right,但这也简单,需要时reverse一下就行了。嗯,刚看了一下groovy的api,fuc k一个,里面有个类ArrayUtil,简直就是一个奇葩,一共250个方法,都是createArray,只是参数是从0到249,难怪这哥们说早知道sca la就不开发groovy了,不过不知道scala中有没有这样的代码。

> > > > > > 要向此网上论坛发帖,请发送电子邮件至...
>
> 阅读更多 >>

陈近南

unread,
Jun 29, 2011, 6:47:15 AM6/29/11
to sca...@googlegroups.com
看来每一个华丽的功能后面还真都有一坨肮脏的代码

若有更多问题,请通过 http://groups.google.com/group/scalacn?hl=zh-CN 访问此网上论坛。

linjie nie

unread,
Jun 29, 2011, 6:57:15 AM6/29/11
to sca...@googlegroups.com
符号太多确实有蛮多不好理解,不如英文的函数(方法)名字来得明确。比如scalaz之类的库,充斥着各种符号,一时半会儿真难弄清楚那些符号的意义。也可能是我自己数学也不太记得了,有些数学里面直接拿过来的符号都搞不清楚了。

2011/6/29 lin qing <linq...@gmail.com>

lin qing

unread,
Jun 29, 2011, 8:21:02 AM6/29/11
to Scala中文社区
据说scalaz就是在scala里面实现一个Haskell标准库,用过的评价下;
"These are mostly *functional* higher order structures that
Haskell boasts as being part of their standard distribution."
http://java.dzone.com/articles/exploring-scalaz
我scala标准库还不熟悉呢,暂时不想去碰scalaz;倒是看了两章《Real World Haskell》,书里对我学习,使用
scala中的很多疑问都有直接的回答。
比如《programing in scala》经常会用到变量xs,《Real world Haskell》里面也会经常用到,而且会解释一
下为什么要写成xs。
个人感觉Haskell偏学术,scala偏产业应用,都是很好的东西,大家怎么看?


On 6月29日, 下午6时57分, linjie nie <nielin...@gmail.com> wrote:
> 符号太多确实有蛮多不好理解,不如英文的函数(方法)名字来得明确。比如scalaz之类的库,充斥着各种符号,一时半会儿真难弄清楚那些符号的意义。也可能是 我自己数学也不太记得了,有些数学里面直接拿过来的符号都搞不清楚了。
>

> 2011/6/29 lin qing <linqin...@gmail.com>

> > > > > > 要取消订阅此网上论坛,请发送电子邮件至 scalacn+u...@googlegroups.com。...
>
> 阅读更多 >>

linjie nie

unread,
Jun 29, 2011, 8:54:38 AM6/29/11
to sca...@googlegroups.com
想仔细学习function编程,haskell多少要看一点,很多这方面的论述都是haskell描述的。

2011/6/29 lin qing <linq...@gmail.com>
Reply all
Reply to author
Forward
0 new messages