st_monad的专栏

放眼身前三十年

用户操作
[即时聊天] [发私信] [加为好友]
st_monadID:st_monad
10058次访问,排名11471,好友0人,关注者0人。
st_monad的文章
原创 12 篇
翻译 0 篇
转载 2 篇
评论 8 篇
最近评论
propers:不懂,或者没有没有用过就不要乱评价。我没有用过,所以我不评价,但是,我还还是要支持一下国产的。加油,呵呵
ahalf:关键是可行性(能炒出东西吗?)
和必要性(非要把里面的字母变成汉字吗?)
下面是我的一段纯汉语程序片段:


主程序
左花括号
打印 左圆括号 左双引号 你好逗号这是一段汉语程序句号 右双引号 右圆括号

右花括号


如果再改进一下,分成简体,繁体和篆体三种,分别对应……
whyned:目前国内计算机语言的发展方向应该是脚本语言,系统语言已经很成熟,难有什么突破性的发展.请关注一款国人自己设计的脚本语言,csm脚本语言.网址是www.smartcsm.cn.
csm脚本语言是当今国内最强大和最完整的静态强类型脚本语言.
也请大家多提意见.
jianghaikevsshibiao:我是个外行,不过觉得还是挺有道理的.呵呵
No1os_sinox:sepl语言支持中文编程,将是世界编程史的重要飞跃,比你想象的强大!sepl定位为无所不能的语言,超过java和C#,而且sepl还能用来开发sinox操作系统!!当然sepl语言不仅仅是中文编程,而是支持本地编程的语言!尤其有sinox支持,可谓强大无比,可以直接操作操作系统底层!让操作系统功能可以无限扩展!
文章分类
收藏
    相册
    attach
    haskell
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 haskell的世界观(2)收藏

    新一篇: haskell的世界观(3) | 旧一篇: haskell的世界观(3)


    一个Monad m定义了一个运算(computation):
    图中上面一个是monad m a,下面一个是function (a->mb)。
    可以大致这么理解,一个monad是包含两面的,它除了在一个世界中作为a以外,还携带了另外一个世界如何从in变化到out的信息。所以,一个monad还叫做action,或者computation。例如,IO monad又称IO action。后面为了不用每次画图,我们这样画一个monad:
    a//in->out,或者a//in,或者a//out
    而a->m b这样画:
    a->b//in->out
     
     
    Monad有四个基本运算分别是:bind(>>=), then(>>), return, fail。
     
     
    从数学的角度讲,一个monad只需要两个运算,>>=和return就够了。不过从程序设计角度,为了便利,添加了>>和fail,他们分别是>>=和return的特化型。
     
    bind运算把一个monad m a的pure部分取出来,放到一个monad constructor (a->m b)中,构造器产生一个新的monad m b,借此把a输送给real world。
    then运算是特殊的bind,它描述了两个monad的顺序诞生。
    return运算是一个特殊的constructor,它接受一个pure world中的a,产生一个monad m a。
    fail运算是特殊的return,它接受一个String之后,产生一个monad,同时把这个String输送给real world。
     
    monad三定律:
    (1) return a >>= k  ==  k a
    (2) m >>= return  ==  m
    (3) m >>= (\x -> k x >>= h)  ==  (m >>= k) >>= h
     
    第一个,monad bind到constructor等价于直接apply monad中的pure部分到constructor。
    第二个,return保留monad的所有信息不变。
    第三个,bind运算满足结合律。
     
    好了,看了这么些难以理解的概念之后,让我们看看几个实际的例子吧。
     
    1. putStrLn :: String -> IO ()
    putStrLn函数根据pure world中的一个String构造了一个IO monad IO ()。
     
    2. Just :: a -> Maybe a
    Just这个constructor根据a构造一个Maybe monad Maybe a。
    试试把一个Maybe monad bind到print看看:
    Prelude> (Just 3)>>=print
        Couldn't match expected type `Maybe' against inferred type `IO'
          Expected type: t -> Maybe b
          Inferred type: t -> IO ()
    看起来,monad只能bind到能够构造同类型monad的constructor上。
    Prelude> let f x | x>=0 = Just (x+1) | x<0 = Nothing
    Prelude> :t f
    f :: (Ord a, Num a) => a -> Maybe a
    Prelude> (Just 3)>>=f
    Just 4
    Prelude> (Just (-1))>>=f
    Nothing
    进一步看看:
    Prelude> :t f 3
    f 3 :: (Ord t, Num t) => Maybe t
    Prelude> :t f (-1)
    f (-1) :: (Ord a, Num a) => Maybe a
    可以看到,real world中不是只有I/O一种action。
     
    3. rollDice = getStdRandom (randomR (1,6)) :: IO Integer
    这是一个随机数产生函数。
    试试看:
    Prelude> :m System.Random
    Prelude System.Random> let rollDice = getStdRandom(randomR(1,6))
    Prelude System.Random> mapM (\x->rollDice) [1..12]
    [3,5,3,6,2,4,5,1,5,6,3,2]
     
     
    st.monad@gmail.com原创,转贴请注明出处,谢谢!
     

    发表于 @ 2007年04月02日 02:21:00|评论(loading...)|编辑

    新一篇: haskell的世界观(3) | 旧一篇: haskell的世界观(3)

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © St Monad