论坛首页 综合技术论坛

失踪的链环

浏览 40309 次
锁定老帖子 主题:失踪的链环
该帖已经被评为精华帖
作者 正文
   发表时间:2006-10-10  
ddd 写道
树的组织数据的方法和语言无关,计算最后的discount自然会出现if else,但方法之优雅恐怕不是什么消息分派这些解决方法能达到的。

erlang看不懂,python那段如果碰上复杂规则恐怕描述都会出问题,整个就是个枚举规则。

举个例子:4项(a1,a2,a3,a4)满足两项=50就加10
discount_rules=[(lambda member:member.a1==50 and member.a2==50,discount_add10),
(lambda member:member.a1==50 and member.a3==50,discount_add10),
(lambda member:member.a1==50 and member.a4==50,discount_add10),
(lambda member:member.a2==50 and member.a3==50,discount_add10),
...
]

只要出现交叉条件,枚举性描述必然会混乱不堪。



ErLang写法

discount(50, 50, _, _) -> ...
discount(_, 50, 50, _) -> ...
discount(_, 50, _, 50) -> ...
discount(_, _, 50, 50) -> ...

....

写起来也很烦琐。
这类有规律的 Rule 应该可以用程序来表达。

比如,假设一个 List, 包含 a1, ... an.

for ( a in List )
   if ( a == 50 ) counter ++;

if (count == 2) ....

如果是没有规律的,就没有办法了。只能采取枚举 if, else, switch case.





0 请登录后投票
   发表时间:2006-10-10  
buaawhl 写道

ErLang写法

discount(50, 50, _, _) -> ...
discount(_, 50, 50, _) -> ...
discount(_, 50, _, 50) -> ...
discount(_, _, 50, 50) -> ...

....

写起来也很烦琐。
这类有规律的 Rule 应该可以用程序来表达。

比如,假设一个 List, 包含 a1, ... an.

for ( a in List )
   if ( a == 50 ) counter ++;

if (count == 2) ....

如果是没有规律的,就没有办法了。只能采取枚举 if, else, switch case.

大马鹿

discount(E,E,_,_,_)->whwere E=50
    %%%+10
discount(A,B,C,D)->
    discount(B,C,D,A,A).
discount(A,B,C,D,A1)->
    discount(B,C,D,A,A1).  
discount(A,B,C,D,A)->
   discount(B,C,D,none,none)
discount(none,none,none,none)->
   ok.
这样管你a有多少个,只要不嫌参数表太长,这四句话就够了.
0 请登录后投票
   发表时间:2006-10-10  
>member.alist=[member.a1,member.a2,member.a3,member.a4........],
discount_rules=[(lambda member:length([for T in [(X,Y )for X in member.alist for Y in member.alist if id(X)!=id(Y)] if (T[1]==50 and T[2]==50)])!=0 ,discount_add10),
...
]

这个……太乱了吧。
如果是这4项满足两项并且那4项也要满足两项(这恐怕属于比较简单的了),这个式子……
不用组合模式必然会出现这种看起来不爽的表达。组合模式就是让这种复杂东西简单化的。
prolog也不懂。
你说的递归不就是组合模式么?
0 请登录后投票
   发表时间:2006-10-10  
ddd 写道
>member.alist=[member.a1,member.a2,member.a3,member.a4........],
discount_rules=[(lambda member:length([for T in [(X,Y )for X in member.alist for Y in member.alist if id(X)!=id(Y)] if (T[1]==50 and T[2]==50)])!=0 ,discount_add10),
...
]

这个……太乱了吧。
如果是这4项满足两项并且那4项也要满足两项(这恐怕属于比较简单的了),这个式子……
不用组合模式必然会出现这种看起来不爽的表达。组合模式就是让这种复杂东西简单化的。
prolog也不懂。
你说的递归不就是组合模式么?


所谓的消息传递只是一个对消息的响应。lambda里面是十么对于消息分派来说根本不关心.消息分派并不是说要你一定要在一张表内解决所有的问题,维持范式必须进行表分解,这我已经说过很多遍了.就像邮政系统,会从国家分发到省分发到市分发到区.但是对于发送者和接收者来说我不用关心你是怎么分发的,分多少及分发的.我只关心接和收.至于里面用啥模式,就是属于你如何去构造一张或者几张表的问题.

0 请登录后投票
   发表时间:2006-10-10  
哦,你一直在提消息分派。
我早说过了:跑个题。

我说的是对这个规则问题本身的解决方法,在我的解决方法里根本没有消息分派的概念(在我的思维中也没有消息分派的概念,认为这个概念没有实际价值)。

0 请登录后投票
   发表时间:2006-10-10  
ddd 写道

我说的是对这个规则问题本身的解决方法,在我的解决方法里根本没有消息分派的概念(在我的思维中也没有消息分派的概念,认为这个概念没有实际价值)。

我在开头就写过了
引用
本文的目的并不在于构造一种新的软件设计方法,或者是对已有的软件设计技术进行批评,而是希望以Message dispatch机制来从新解释现有的几种常用程序设计技巧

没有什么新发明也没有新东西.只是对这些已有的设计方法的内在工作机制做些简单的介绍,对于普通程序员来说也没有什么帮助,原来该怎么干还怎么干.就像Java编译器的内部工作原理,对于普通的程序员自然也是没有什么实际使用价值的.

0 请登录后投票
   发表时间:2006-10-10  
Java编译器的内部工作原理那是实在的东西,和实际联系紧密。
消息分派这种是抽象出来的东西,本身和实际是脱钩的,所以才要看看这个概念的提出对实际有没有推动力。
0 请登录后投票
   发表时间:2006-10-10  
脱不脱钩,我不太清楚.有没有实际推动力这个问题上.我是非常赞同你的观点的.我的看法和你一样,我也认为这个东西肯定不太会推动什么语言新发展了.虽然消息分派是,<SICP>,<CPL>,<PLAI>这些国外程序语言设计权威教材里面的标准篇章,但是也是30多年前的老技术了.当年的确由此推动过大批OO语言到现在,现在么估计也是发展到头了.Ruby还不是一直在炒smalltalk的Message passing的冷饭阿不是么?这点上你看得比我深.
0 请登录后投票
   发表时间:2006-10-10  
深是没有的,因为我在这方面的理论几乎为0,我只不过极端偏向实用主义而已。

我重新从“学术”的思维思考你这个消息分派思考了近2个小时(当然不是连续思考这么长时间),还是感觉到纯抽象的思考的那种快感,似乎这个东西是为了达到完全解耦出现的(但实际上没达到完全),要说学术这个东西是无法预料将来的,没准什么时候结合另外的技术后焕发第二春,随便说说,没准能和web service,什么智能agent一起再抽象点东西出来。
0 请登录后投票
   发表时间:2006-10-11  
T1关于二维表比喻的rule匹配让我想起最早期的决策工具:decision table(决策表)。JBoos Rules(Drools)就支持在Excel里的decision table方式的DSL规则描述。形如:
Condition   |     Action
C1   |  C2       A1 | A2
Yes    __   |          x
No    Yes   |    x        


条件一般是最大的可组合单位,像前面提到的“4个里有两个数是50”,如果没别的条件,是可以写成“第一个是50,第二个是50。。。”4个条件;但是如果还有其它条件,“4个里有两个数是50”就只是一个条件了(T1说的high order)。

决策表缺点也不少:首先它默认表达AND条件组合,OR条件组合就要拆成多条表达,造成冗余。其次为了简单,决策表不要求穷举所有的条件组合,在“超强类型”的OCaml里pattern match没有穷举完所有的可能pattern的话是会出警告的(Erlang? Haskell?)。最后就是ajoo说的条件冲突问题,这确实不是决策表的事,但一般的rule engine在走完rete网络后如果发现冲突的话会根据rule优先级或别的条件判断处理,FP pattern match好像除了自己安排条件把高优先级的放前面外没什么好办法。。。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics