• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
             
                 摘要: 有的時(shí)候,IO的異常處理由于需要一個(gè)IOEnv類型的參數(shù)而顯得非常麻煩。這個(gè)時(shí)候我們可以定制自己的一套異常處理系統(tǒng),從而讓程序變得清晰起來(lái)。自己的異常處理系統(tǒng)不同于IO,是沒(méi)有副作用的函數(shù)集合。下面讓我們看一看如何使用自定義的異常處理系統(tǒng)來(lái)分析一個(gè)四則運(yùn)算表達(dá)式。  閱讀全文
            posted @ 2008-12-18 21:23 陳梓瀚(vczh) 閱讀(1449) | 評(píng)論 (0)編輯 收藏
                 摘要: 說(shuō)到底Kernel FP是一個(gè)腳本引擎,所以是需要API的。接下來(lái)的代碼用來(lái)加載一些Kernel FP代碼文件,并執(zhí)行main函數(shù)。  閱讀全文
            posted @ 2008-12-17 19:15 陳梓瀚(vczh) 閱讀(1635) | 評(píng)論 (1)編輯 收藏
                 摘要: 我們知道,循環(huán)本身是沒(méi)有返回值的。所以在純函數(shù)式語(yǔ)言下,跟IO有關(guān)的循環(huán)才有足夠的副作用來(lái)產(chǎn)生價(jià)值。于是利用IO Monad,我們就可以實(shí)現(xiàn)循環(huán)了。循環(huán)是一個(gè)函數(shù):  閱讀全文
            posted @ 2008-12-15 07:56 陳梓瀚(vczh) 閱讀(2156) | 評(píng)論 (2)編輯 收藏
                 摘要: 前面說(shuō)過(guò),需要一個(gè)語(yǔ)法糖來(lái)組織IO,并且在其中的一步產(chǎn)生錯(cuò)誤的時(shí)候立刻返回錯(cuò)誤。現(xiàn)在我們看一段代碼:  閱讀全文
            posted @ 2008-12-15 06:22 陳梓瀚(vczh) 閱讀(1476) | 評(píng)論 (0)編輯 收藏
                由于Kernel FP是純的,所以一個(gè)函數(shù)的輸出只跟輸入有關(guān)系,所以從屏幕上輸入文字的函數(shù)read是不能定義成func read::string的。因?yàn)楦鶕?jù)這個(gè)性質(zhì),read的結(jié)果必須是一樣的。所以一定要在每一次read的時(shí)候給不同的參數(shù)。但是其實(shí)沒(méi)關(guān)系,這個(gè)可以用編譯器來(lái)解決,就算read的順序是運(yùn)行時(shí)決定的。同樣的問(wèn)題也出現(xiàn)在Haskell的IO Monad上,由于資料無(wú)窮多,我就不詳細(xì)解釋了。下面給出沒(méi)有語(yǔ)法糖的,能夠正常并確定順序地使用IO函數(shù)的一段代碼:

             1 data IOError
             2   = ioemessage string
             3 type IOEnv
             4 type IO T = IOEnv -> maybe (pair T IOEnv) IOError
             5 
             6 func read :: IO string alias "demo::read"
             7 func readint :: IO int alias "demo::readint"
             8 func write :: string -> IO void alias "demo::write"
             9 func writeln :: string -> IO void alias "demo::writeln"
            10 func iovoid :: IO void alias "demo::iovoid"
            11 
            12 def (>>>) a b = a >>= \p->b
            13 func return T :: T -> IO T
            14 def return x e = success (pair x e)
            15 func (>>=) T1 T2 :: IO T1 -> (T1 -> IO T2) -> IO T2
            16 def (>>=) a b e = select a e of
            17   case fail message : fail message
            18   case success p : select p of
            19     case pair x e2 : b x e2
            20   end
            21 end
            22 
            23 def ioseq ios = foldr iovoid (>>>) ios
            24 
            25 def mainIO_0 = 
            26   read >>= \name->
            27   read >>= \place->
            28   writeln ("Hello "+name+" from "+place+".">>>
            29   readint >>= \a->
            30   readint >>= \b->
            31   writeln (itoa (a+b)) >>>
            32   writeln "Press [ENTER] to enter" >>>
            33   read
            34 
            35 def mainIO_1 = ioseq (transform writeln ["genius","vczh"])

                mainIO_0使用類型系統(tǒng)強(qiáng)制了IO函數(shù)的執(zhí)行順序,mainIO_1證明了IO也是可以使用正常的操作函數(shù)去進(jìn)行復(fù)雜操作的。不過(guò)mainIO_0那種寫法還是挺不舒服的,這就是語(yǔ)法糖發(fā)揮作用的啦。我只需要給出一種相對(duì)好看的語(yǔ)法,然后在語(yǔ)法分析的時(shí)候翻譯成這樣就行了。

                這種寫法的好處是,萬(wàn)一其中有一個(gè)IO出了問(wèn)題,錯(cuò)誤信息會(huì)直接傳達(dá)出去,中斷函數(shù)執(zhí)行。而且整個(gè)函數(shù)都是在類型系統(tǒng)的保護(hù)之下的。
            posted @ 2008-12-14 22:44 陳梓瀚(vczh) 閱讀(1767) | 評(píng)論 (0)編輯 收藏
                考慮以下代碼:
            1 def overloading x = "General overloading"
            2 func overloading::string->string
            3 def overloading str = "String overloading"
            4 func overloading T::list T->string
            5 def overloading xs = "List overloading"

                這是三個(gè)函數(shù),類型分別為:
            1     func overloading T1 :: (<T1> -> (system.list system.char)) codefrom 125
            2     func overloading :: ((system.list system.char-> (system.list system.char)) codefrom 127
            3     func overloading T1 :: ((system.list <T1>-> (system.list system.char)) codefrom 129

                所以當(dāng)我們寫overloading的時(shí)候,究竟選擇什么呢?三個(gè)類型都是可以接受的,而且都是可以完美通過(guò)類型推導(dǎo)的。于是我新加了一個(gè)規(guī)則。首先求出需要的具體類型(可能是含有參數(shù)的類型),然后計(jì)算從函數(shù)類型到具體類型所需要替換的類型參數(shù)的個(gè)數(shù)以及每個(gè)類型參數(shù)的解,最后計(jì)算出一個(gè)系數(shù)=數(shù)量×65536+解的深度和。

                深度的規(guī)定比較簡(jiǎn)單,基本類型深度為1,閉包類型為參數(shù)和結(jié)果兩種類型的深度的最大值加1,帶有參數(shù)的類型等于最大參數(shù)深度加1。所以在這個(gè)例子上,我們可以得到,T1到list char的解為T1=list char,list char到list char的解為0,list T1到list char的解為T1=char,系數(shù)分別是65538、0和65537,所以理所當(dāng)然地挑選了第二個(gè)。下面看例子:
            1 def main114 = overloading 1024
            2 def main115 = overloading "Genius Vczh!"
            3 def main116 = overloading [1,2,3]

                下面是運(yùn)行結(jié)果:
            1 main114返回值:"General overloading"
            2 main115返回值:"String overloading"
            3 main116返回值:"List overloading"
            posted @ 2008-12-14 19:42 陳梓瀚(vczh) 閱讀(1468) | 評(píng)論 (0)編輯 收藏
                現(xiàn)在的Kernel FP已經(jīng)支持列表語(yǔ)法和操作符語(yǔ)法了。

                列表語(yǔ)法為[1,2,3,4,5]。原來(lái)是需要寫成list 1 (list 2 (list 3 (list 4 (list 5 empty))))的。不過(guò)后面這種寫法仍然是支持的。
                操作符可以自定義,凡是僅由“+-*/%<>=!&^|~@#$?”構(gòu)成,而又不是“|”和“=”的記號(hào)都可以視為二元操作符。如果是+、-、*、/、%、<、<=、>、>=、==、!=、^、&&和||的話,優(yōu)先級(jí)跟C++一樣。如果是其他操作符,那么優(yōu)先級(jí)一致而且最低。

                因?yàn)椴僮鞣彩莻€(gè)函數(shù),因此將操作符作為函數(shù)使用的時(shí)候只需要加一對(duì)括號(hào)就可以了,不過(guò)中間不可以有空格。所以我們就可以定義“+”并寫出下面的代碼:
            1 def (+= iadd
            2 def (+= fadd
            3 def (+= concat
            4 def main102 = (+1 2
            5 def main103 = (+1.0 2.0
            6 def main104 = (+"Genius" " Vczh!"
            7 def main105 = 1 + 2
            8 def main106 = 1.0 + 2.0
            9 def main107 = "Genius" + " Vczh!"

                下面是執(zhí)行結(jié)果:
            1 main102返回值:3
            2 main103返回值:3.0
            3 main104返回值:"Genius Vczh!"
            4 main105返回值:3
            5 main106返回值:3.0
            6 main107返回值:"Genius Vczh!"

                操作符的優(yōu)先級(jí)比函數(shù)低,因此sin a + sin b實(shí)際上是(sin a)+(sin b)。 于是下面的代碼返回8.0:
            1 def main108 = ln (exp 3.0+ ln (exp 5.0)

                有了操作符之后,就可以慢慢為IO、Exception等復(fù)雜對(duì)象建模并且開發(fā)語(yǔ)法糖了。
            posted @ 2008-12-14 08:37 陳梓瀚(vczh) 閱讀(1772) | 評(píng)論 (2)編輯 收藏
                 摘要: 為了測(cè)試Kernel FP的健壯性以及進(jìn)行一些bug的排除,一個(gè)四則運(yùn)算式子的分析程序理所當(dāng)然地就被實(shí)現(xiàn)了。代碼如下:  閱讀全文
            posted @ 2008-12-13 07:13 陳梓瀚(vczh) 閱讀(3350) | 評(píng)論 (2)編輯 收藏
                 摘要: 經(jīng)過(guò)1個(gè)小時(shí)的奮斗,修了3個(gè)bug,終于使得Kernel FP能運(yùn)行的代碼漸漸多了起來(lái)。現(xiàn)在可以看看純函數(shù)式語(yǔ)言簡(jiǎn)潔的代碼及運(yùn)行結(jié)果啦!

            下面是很多用于測(cè)試的main函數(shù):  閱讀全文
            posted @ 2008-12-12 10:03 陳梓瀚(vczh) 閱讀(1452) | 評(píng)論 (1)編輯 收藏
                 摘要: Kernel FP已經(jīng)可以運(yùn)行小程序了。現(xiàn)在還處于測(cè)試階段,過(guò)于復(fù)雜的程序估計(jì)是跑不過(guò)的。先簡(jiǎn)單介紹一下如何在C++調(diào)用Kernel FP的代碼。  閱讀全文
            posted @ 2008-12-10 23:03 陳梓瀚(vczh) 閱讀(1716) | 評(píng)論 (2)編輯 收藏
            僅列出標(biāo)題
            共35頁(yè): First 21 22 23 24 25 26 27 28 29 Last 
            伊人色综合久久天天网| 亚洲欧美精品伊人久久| 国产99久久九九精品无码| 国产高潮国产高潮久久久| 亚洲AV无码久久寂寞少妇| 久久中文字幕人妻熟av女| 热99RE久久精品这里都是精品免费| 久久国产精品偷99| 国产精品美女久久久久av爽| 久久精品国产99久久无毒不卡| 久久精品夜夜夜夜夜久久| 久久精品人人做人人妻人人玩| 精品熟女少妇a∨免费久久| 嫩草伊人久久精品少妇AV| 996久久国产精品线观看| 青青热久久综合网伊人| 久久99精品国产麻豆蜜芽| 久久久久亚洲国产| 性欧美丰满熟妇XXXX性久久久| 国产∨亚洲V天堂无码久久久| 天天久久狠狠色综合| 久久久久亚洲精品中文字幕| 日产精品久久久久久久| 久久精品无码专区免费东京热| 久久美女网站免费| 久久久久久久免费视频| 国产精品无码久久综合| 久久精品女人天堂AV麻| 人妻精品久久久久中文字幕69 | 亚洲国产成人久久精品99| 久久精品国产亚洲av麻豆图片| 日韩精品无码久久久久久| 伊人色综合久久天天| 一级女性全黄久久生活片免费 | 国产精品久久久久AV福利动漫| 国产免费久久久久久无码| 日韩精品无码久久久久久| 久久精品无码一区二区三区日韩| 久久久久国产精品人妻 | 99久久国产主播综合精品| 97久久国产露脸精品国产|