论坛首页 Java企业应用论坛

jaskell script

浏览 14933 次
锁定老帖子 主题:jaskell script
该帖已经被评为精华帖
作者 正文
   发表时间:2005-02-03  
你现在下载的版本还不支持f(a,b,c)这种语法。
我刚刚增加了这个语法,不过还没有发上去。
回头我按照你的建议整理一下package再发出去。
0 请登录后投票
   发表时间:2005-02-03  
放在sf.net的CVS上代码是最新的吗?
0 请登录后投票
   发表时间:2005-02-03  
是最新的代码。不过最新的tutorial还没在那上面。而且最新版本不在head,而是一个叫mutable_branch的分支里面。(主要是不大会用cvs,没找着怎么merge回去
0 请登录后投票
   发表时间:2005-02-03  
个人觉得,你的设计目标和现在的语法差距比较大。
如果你针对,没有学习过编成的业务人员,似乎类haskell语法的门槛要比impretive的高的多。所有的循环除了那个foreach,将来估计都要用递归去解决,还有lazy,curry。这些东西没有一定的数学和coding 基础的很难去理解和掌握。

如果要说有什么建议的话,我希望这个语言的基本数据结构更加多一点,数据结构的操作能够更加简单一点。
比如说,
你的toturial 里面对list 的操作,只是用:去分片。但是对于没有编成经验的人来说这太难理解。
[1,2,3,4,5]。最简单的一个运算要给列表的第2项+1,这个似乎写起来就超级麻烦啊。就算后面你提供了foreach,恐怕也是比较麻烦。干嘛不学学python的list呢?

另外你tuple和list的间隔符,为何不统一用","或者";"号呢?搞两个有些罗嗦。
0 请登录后投票
   发表时间: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};


这样才对吧
0 请登录后投票
   发表时间:2005-02-03  
我建议,jaskell里面至少要有hash或者map,即使不是语法上的,也应该是库上的。这个结构太重要了。
如果说用java的hash库的话,我觉得就没有list,tuple那样语法上的直观性。毕竟你是要给没有coding 经验的人用,越简单越直接越好。
0 请登录后投票
   发表时间: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?
有点不知所措了。
0 请登录后投票
   发表时间: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"


也可以得到一个查找表啊。
0 请登录后投票
   发表时间: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出来了,一定请再提提意见。
这个双引号问题,估计是不小心在中文状态下敲的。
0 请登录后投票
   发表时间: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;


大家觉得哪个更好?
0 请登录后投票
论坛首页 Java企业应用版

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