锁定老帖子 主题:jaskell script
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2005-02-03
你现在下载的版本还不支持f(a,b,c)这种语法。
我刚刚增加了这个语法,不过还没有发上去。 回头我按照你的建议整理一下package再发出去。 |
|
返回顶楼 | |
发表时间:2005-02-03
放在sf.net的CVS上代码是最新的吗?
|
|
返回顶楼 | |
发表时间:2005-02-03
是最新的代码。不过最新的tutorial还没在那上面。而且最新版本不在head,而是一个叫mutable_branch的分支里面。(主要是不大会用cvs,没找着怎么merge回去 )
|
|
返回顶楼 | |
发表时间:2005-02-03
个人觉得,你的设计目标和现在的语法差距比较大。
如果你针对,没有学习过编成的业务人员,似乎类haskell语法的门槛要比impretive的高的多。所有的循环除了那个foreach,将来估计都要用递归去解决,还有lazy,curry。这些东西没有一定的数学和coding 基础的很难去理解和掌握。 如果要说有什么建议的话,我希望这个语言的基本数据结构更加多一点,数据结构的操作能够更加简单一点。 比如说, 你的toturial 里面对list 的操作,只是用:去分片。但是对于没有编成经验的人来说这太难理解。 [1,2,3,4,5]。最简单的一个运算要给列表的第2项+1,这个似乎写起来就超级麻烦啊。就算后面你提供了foreach,恐怕也是比较麻烦。干嘛不学学python的list呢? 另外你tuple和list的间隔符,为何不统一用","或者";"号呢?搞两个有些罗嗦。 |
|
返回顶楼 | |
发表时间:2005-02-03
给你的tutorial 提一个建议,这""号的方向都不对啊。文字也到算了,这代码看的我就头晕阿
“newtuple.age = “ + newtuple.age +”. oldtuple.age = ”+oldtuple.age where oldtuple = {age=5;weight=10}; newtuple = oldtuple.{age=11}; 应该是 “newtuple.age =” + newtuple.age +“. oldtuple.age = ”+oldtuple.age where oldtuple = {age=5;weight=10}; newtuple = oldtuple.{age=11}; 这样才对吧 |
|
返回顶楼 | |
发表时间:2005-02-03
我建议,jaskell里面至少要有hash或者map,即使不是语法上的,也应该是库上的。这个结构太重要了。
如果说用java的hash库的话,我觉得就没有list,tuple那样语法上的直观性。毕竟你是要给没有coding 经验的人用,越简单越直接越好。 |
|
返回顶楼 | |
发表时间:2005-02-04
Trustno1 写道 个人觉得,你的设计目标和现在的语法差距比较大。
如果你针对,没有学习过编成的业务人员,似乎类haskell语法的门槛要比impretive的高的多。所有的循环除了那个foreach,将来估计都要用递归去解决,还有lazy,curry。这些东西没有一定的数学和coding 基础的很难去理解和掌握。 是这样的。在我那个英文的介绍里,针对业务人员的只有那么半页东西,他们也就是写个公式啦,定义几个简单的函数之类。 不指望他们去的写什么循环或者递归,也不想让他们去处理副作用。而没有副作用,也基本就不用知道lazy这回事了。 如果逻辑真的须要这么复杂,可以让技术人员用jaskell或者java写好一个函数库让他们调用。 curry他们也不需要懂。 一句话,他们就象用excel一样用就行了。 Trustno1 写道 如果要说有什么建议的话,我希望这个语言的基本数据结构更加多一点,数据结构的操作能够更加简单一点。 现在的内建数据结构只有list和tuple。应该也够了。list对付线性,tuple对付结构和查找表。还有什么其它必要的结构吗? Trustno1 写道 比如说, 你的toturial 里面对list 的操作,只是用:去分片。但是对于没有编成经验的人来说这太难理解。 [1,2,3,4,5]。最简单的一个运算要给列表的第2项+1,这个似乎写起来就超级麻烦啊。就算后面你提供了foreach,恐怕也是比较麻烦。干嘛不学学python的list呢? list支持下标存取的,你这个要求可以这样 [1,2,3,4]@1+1 只不过,列表索引从0开始可能有点别扭。 而如果你说的是新生成一个列表,让第二个元素增加1的话,可以通过函数库解决: set_elem i [] = [], i h:l = if i==0 then (h+1);:l else h:(set_elem (i-1); l);; @操作符可以作用在list/tuple/array上。 还有,list/tuple/array都支持#符号,用来得到这个容器的大小。 Trustno1 写道 另外你tuple和list的间隔符,为何不统一用","或者";"号呢?搞两个有些罗嗦。 这个,tuple用分号也是迫不得已。本想用逗号,但是逗号被pattern match占用了。 要是list间隔也用分号,我又比较喜欢逗号,觉得漂亮一些。 要不就反过来?用逗号来分隔函数定义和列表元素,用分号来分隔pattern match? 有点不知所措了。 |
|
返回顶楼 | |
发表时间:2005-02-04
Trustno1 写道 我建议,jaskell里面至少要有hash或者map,即使不是语法上的,也应该是库上的。这个结构太重要了。
如果说用java的hash库的话,我觉得就没有list,tuple那样语法上的直观性。毕竟你是要给没有coding 经验的人用,越简单越直接越好。 有的。tuple同时就可以用来做map。 比如: extend {name="tom"; age=10} "birthday" "10/30/1999" 就产生一个新的tuple,值是: {name="tom"; age=10; birthday="10/30/1999"} prelude库里面还定义了一个assoc函数,用来从list生成tuple。 如: assoc ["name", "tom", "age", 10] 也可以生成这样的tuple。 tuple里面的成员可以通过静态的名字存取也可以动态存取,比如对上面定义的tuple,我可以这样写: $$<<name=${tuple@"name"}, birthday=${tuple.birthday}>>$$ 这个$$<< 和 >>$$用来括起来带双引号等特殊字符的又没有escape的字符串。ruby, python等叫这个here-docs。 它允许字符串interpolation。就是用动态evaluate这个$符号引导的子表达式的值。 第一个name是用动态的字符串取得静态定义的成员。而birthday就反过来,用静态的birthday这个名字取得动态生成的"birthday"这个成员。 另外,因为支持直接用java,如果高兴,也可以自己把java.util.HashMap之类的mutable structure import进来。比如: let HashMap = import "java.util.HashMap"; hash = let h = HashMap.new[]; in h.put["name","tom"] >> h.put["age", 10] >> h; in hash@"name" 也可以得到一个查找表啊。 |
|
返回顶楼 | |
发表时间:2005-02-04
Trustno1 写道 给你的tutorial 提一个建议,这""号的方向都不对啊。文字也到算了,这代码看的我就头晕阿
“newtuple.age = “ + newtuple.age +”. oldtuple.age = ”+oldtuple.age where oldtuple = {age=5;weight=10}; newtuple = oldtuple.{age=11}; 应该是 “newtuple.age =” + newtuple.age +“. oldtuple.age = ”+oldtuple.age where oldtuple = {age=5;weight=10}; newtuple = oldtuple.{age=11}; 这样才对吧 代码确实写的很乱。等回头新版本的tutorial出来了,一定请再提提意见。 这个双引号问题,估计是不小心在中文状态下敲的。 |
|
返回顶楼 | |
发表时间:2005-02-04
对一个语法征求一下意见.当前是用逗号来分隔pattern match的不同case。比如比较两个列表大小的代码:
compare [] [] = 0 , [] _ = -1 , _ [] = 1 , h1:l1 h2:l2 = if h1==h2 then compare l1 l2 else if h1>h2 then 1 else -1; 我刚才又觉得好像用竖线|比较好,结果会是这样: compare [] [] = 0 | [] _ = -1 | _ [] = 1 | h1:l1 h2:l2 = if h1==h2 then compare l1 l2 else if h1>h2 then 1 else -1; 大家觉得哪个更好? |
|
返回顶楼 | |