青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 9,  comments - 19,  trackbacks - 0

類(lèi)型系統(tǒng)在編程語(yǔ)言中是極為重要,不單單是提供一個(gè)類(lèi)型的標(biāo)注或是方便編譯,更多時(shí)候是減少出錯(cuò)的可能。當(dāng)類(lèi)型系統(tǒng)強(qiáng)大到一定程度,就可以進(jìn)行所謂的“富類(lèi)型編程”,比如在Haskell中只要編譯器不報(bào)錯(cuò),大致上程序也是沒(méi)什么bug的。在常用的靜態(tài)類(lèi)型語(yǔ)言中,C++/java/C#等,雖然在新標(biāo)準(zhǔn)與新版本中支持類(lèi)型的自動(dòng)推導(dǎo),但是對(duì)類(lèi)型系統(tǒng)及其推導(dǎo)還是缺少更為直接的支持。

很多常用語(yǔ)言的類(lèi)型系統(tǒng)都是圖靈完全的,比如C++,Scala,Haskell,Qi/Shen(一種Lisp方言),比如C++和Scala為什么是圖靈完全是很好理解的,它們依賴的是類(lèi)型的模式匹配,C++中則對(duì)應(yīng)特化與偏特化,Scala可以使用類(lèi)型的繼承關(guān)系等等。

既然是非專(zhuān)業(yè)研究,下面就用非專(zhuān)業(yè)手段論證有些類(lèi)型系統(tǒng)的Turing Complete。

“程序就是類(lèi)型的證明”

這句話結(jié)合Curry-Howard同構(gòu)揭露出來(lái)的東西是很深刻的。下表是一部分的對(duì)應(yīng)關(guān)系:

 logic side  program side
 Hilbert-style deduction system type system for combinatory logic 
 natural deduction type system for lambda calculus 
 hypotheses  free variables 
 deduction theorem  abstraction elimination 
?。?/td>?。?/td>
 Peirce's law  cal/cc 
 double-negation translation  CPS translation 

注:表格中倒數(shù)第二行call/cc (call with current continuation) ((α → β) → α) → α所代表的排中律,在簡(jiǎn)單類(lèi)型lambda演算中是類(lèi)型不居留的,這也是為什么用傳說(shuō)中的Lisp七大公理無(wú)法做出call/cc來(lái)的另一個(gè)角度的原因。

類(lèi)型與推理系統(tǒng)則是與形式化語(yǔ)言最為接近的地方。類(lèi)型系統(tǒng)從不同的角度可以分為很多種,靜態(tài)/動(dòng)態(tài),強(qiáng)/弱,子類(lèi)型類(lèi)型系統(tǒng),Duck Type,Dependent types,Union types等等。從類(lèi)型推導(dǎo)的角度上,又有System F,HM類(lèi)型系統(tǒng)等等。在Curry Howard同構(gòu)的意義上來(lái)說(shuō),程序語(yǔ)言的語(yǔ)言構(gòu)造同構(gòu)為推理系統(tǒng)的推理規(guī)則,例如System F代表的二階直覺(jué)邏輯等等。

以著名的S組合子:S = λx. λy. λz. xz(yz)作為例子
它的類(lèi)型是 (α → β → γ) → (α → β) → α ,對(duì)它的證明可以移步 wiki 。

正文

說(shuō)到圖靈完全,大家一定不陌生,我們每天都在用圖靈完全的語(yǔ)言來(lái)做各種事情(不是所有的語(yǔ)言都是圖靈完全的,比如HTML,正則)。而類(lèi)型系統(tǒng)的圖靈完全,可以粗略的認(rèn)為是在Type Checker和Type Inference上可以理論做到所有的事情(不論寫(xiě)起來(lái)丑不丑!)。

Qi/Shen

Qi語(yǔ)言是Shen語(yǔ)言的前身,屬于Lisp的方言,可以看成是擴(kuò)展了靜態(tài)類(lèi)型系統(tǒng)與內(nèi)置Prolog、Patten Match、自定義求值策略等多個(gè)功能的CLisp擴(kuò)展。它的類(lèi)型系統(tǒng)的顯著特點(diǎn)是采用了Dependent Type System,正如其字面意思,我們來(lái)看一個(gè)例子

(datatype t
Name : String;
Telephone : String;
======

[Name Telephone] : t;
)

(注:其中 =====這個(gè)東西是個(gè)語(yǔ)法糖,是

(datatype t
Name : String;
Telephone : String;
----------

[Name Telephone] : t; )

(datatype t
Name : String,
Telephone : String; >> P
---------

[Name Telephone] : t >> P )

的合寫(xiě)。)

如果熟悉Sequent calculus的話,上面的寫(xiě)法簡(jiǎn)直就是對(duì)著公式畫(huà)下來(lái)的~而且在上面類(lèi)型定義的condition line中還支持if (element? X [0 1]這種寫(xiě)法。

Sequent calculus是圖靈完全的,Qi/Shen的Type System基于Sequent calculus,自然也是圖靈完全的。

Haskell

Haskell的類(lèi)型系統(tǒng)屬于著名的Hindley–Milner type system,是基于lambda演算與參數(shù)多態(tài)(parametric polymorphism)的經(jīng)典類(lèi)型系統(tǒng),當(dāng)然Haskell的不同版本在上面都有不同的類(lèi)型系統(tǒng)擴(kuò)展。
下面就是這篇文章中比較好玩的地方,如何利用SK Combinator來(lái)論證Haskell類(lèi)型系統(tǒng)的圖靈完全性。

與Qi/Shen語(yǔ)言不一樣,Haskell的類(lèi)型推導(dǎo)規(guī)則是基于對(duì)謂詞(Predicate)的演繹求解,下面的內(nèi)容利用Haskell的Type Checker做出SK Combinator。為了做成不對(duì)應(yīng)實(shí)現(xiàn)的函數(shù)聲明,我們使用undefined與-fallow-undecidable-instances的ghc選項(xiàng)。
首先,先定義基本的SK Combinator的term和Application:

data K0 data S0 data App x y data Other a 

接下來(lái)聲明一個(gè)用來(lái)歸約結(jié)果的歸約函數(shù)的class和Instance:

 
data Done
data More
class CombineDone d1 d2 d | d1 d2 -> d

instance
CombineDone Done Done Done
instance
CombineDone Done More More
instance
CombineDone More Done More
instance
CombineDone More More More

當(dāng)然還得聲明一個(gè)真正用來(lái)歸約term的歸約函數(shù):

class Eval1 x y d | x -> y d 

然后在Instance中寫(xiě)入歸約的規(guī)則:


instance Eval1 S0 S0 Done
instance
Eval1 K0 K0 Done
instance
Eval1 (Other a) (Other a) Done
instance
Eval1 x x' d => Eval1 (App K0 x) (App K0 x') d
instance
Eval1 x x' d => Eval1 (App S0 x) (App S0 x') d
instance
( Eval1 x x' d1
, Eval1 y y' d2
, CombineDone d1 d2 d
) => Eval1 (App (App S0 x) y) (App (App S0 x') y') d
instance
Eval1 x x' d => Eval1 (App (Other a) x) (App (Other a) x') d
instance ( Eval1 x x' d1
, Eval1 y y' d2
, CombineDone d1 d2 d
) => Eval1 (App (App (Other a) x ) y )
(App (App (Other a) x') y') d
instance
( Eval1 x x' d1
, Eval1 y y' d2
, Eval1 z z' d3
, CombineDone d1 d2 d4
, CombineDone d3 d4 d
) => Eval1 (App (App (App (Other a) x ) y ) z )
(App (App (App (Other a) x') y') z') d

下面這是真正的S和K的定義:
S Combinator :   λx. λy. λz. xz(yz)

instance Eval1 (App (App (App S0 f) g) x)             (App (App f x) (App g x))             More 

K Combinator :   λx. λy. x

instance Eval1 (App (App K0 x) y)         x     More instance Eval1 (App (App (App K0 x) y) z) (App x z) More 

光有這些特化的規(guī)則還不夠,再加上不能被上述rules歸約的情景處理:

instance ( Eval1 (App (App (App p q) x) y)  a d )
=>
Eval1 (App (App (App (App p q) x) y) z) (App a z) d

再添加一些輔助的類(lèi)型

class EvalAux x y q1 | x q1 -> y
instance EvalAux x x Done
instance
( Eval1 x y q
, EvalAux y z q
) => EvalAux x z More
class Eval x y | x -> y
instance
EvalAux x y More => Eval x y

做到這里,我們已經(jīng)得到了一個(gè)可以直接表示 X -> Y計(jì)算的類(lèi)型了,光有類(lèi)型聲明是跑不起來(lái)的,最后輔上dummy types與undefined的method:

data P0 
data Q0
data R0
type P = Other P0
type Q = Other Q0
type R = Other R0
eval1 :: Eval1 x y q => x -> y
eval1 = undefined
eval :: Eval x y => x -> y
eval = undefined
bot :: a bot = undefined

這樣就可以做出最基本的例子:

type K x y   = App (App K0 x) y
type S f g x = App (App (App S0 f) g) x
testK = eval (bot :: K P Q) :: P
testS = eval (bot :: S P Q R) :: App (App P R) (App Q R)

這樣!高洋上的SK Combinator就做成來(lái)了,它在類(lèi)型推導(dǎo)上已經(jīng)可以正確的歸約,接下來(lái),你就可以造出整個(gè)世界了。

延伸

研究函數(shù)式編程與類(lèi)型系統(tǒng)是很有意思的事情,不像很多常用的語(yǔ)言,總有一些“王八的屁股--規(guī)定”,比如Python莫名其妙的Scoping問(wèn)題,js莫名其妙的運(yùn)算結(jié)果等等。而正兒八經(jīng)設(shè)計(jì)出來(lái)的函數(shù)式語(yǔ)言大多數(shù)特性都是對(duì)其設(shè)計(jì)思路的延伸,F(xiàn)-algebras,F(xiàn)ix Point,F(xiàn)ree Monad,F(xiàn)oldable&Traversable等等,不僅僅是一種編程技巧,也代表了另一個(gè)方向上的Program Pattarn。

Haskell和Ocaml都是基于Hindley-Milner系統(tǒng),但也都對(duì)類(lèi)型系統(tǒng)打上了各式各樣的補(bǔ)丁,對(duì)程序?qū)懛ǖ闹С殖潭纫彩歉魇礁鳂印?/p>

例如,Haskell不能處理遞歸的定義,就比如\x -> x x,haskell是不支持的,因?yàn)樵谀涿瘮?shù)類(lèi)型推斷上屬于簡(jiǎn)單類(lèi)型的lambda演算,不額外引入μ算符的話是無(wú)法處理的。這樣,眾所周知的Y Combinator就只能寫(xiě)成:

newtype Mu a = Mu (Mu a -> a) 
y :: (a -> a) -> a
y f = (\h -> h $ Mu h) (\x -> f . (\(Mu g) -> g) x $ x)

(注:可詳見(jiàn)我的 另一篇博文

Ocaml則有補(bǔ)丁應(yīng)對(duì)這種情景,加上了as語(yǔ)義,類(lèi)型將被識(shí)別為(a -> a as a) -> a

對(duì)于這段代碼:

data Sum a b = LeftSum a 
| RightSum b
lengthxs list = case list of
LeftSum [] -> 0
RightSum (x:xs) -> 1 + lengthxs xs

Haskell無(wú)法通過(guò)編譯,Ocaml則可以~


本人博客地址(http://www.shnenglu.com/pwq1989/)
posted on 2014-07-10 15:14 右席 閱讀(3536) 評(píng)論(7)  編輯 收藏 引用 所屬分類(lèi): 搬磚之路
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品中文字幕免费mv| 久久亚洲欧洲| 午夜精品电影| 亚洲欧美美女| 久久超碰97人人做人人爱| 久久国产欧美| 欧美 日韩 国产一区二区在线视频 | 久久久99爱| 久久久在线视频| 蜜臀va亚洲va欧美va天堂| 欧美国产精品日韩| 欧美另类女人| 欧美性一区二区| 国产精品一区免费视频| 国产一区二区三区精品久久久| 国产在线日韩| 最新日韩在线| 亚洲一区二区黄| 欧美制服第一页| 嫩草国产精品入口| 日韩一级精品| 香蕉久久国产| 欧美.www| 国产精品萝li| 狠狠色噜噜狠狠色综合久| 亚洲精品国精品久久99热一| 99精品欧美一区二区三区综合在线| 亚洲尤物精选| 老**午夜毛片一区二区三区| 亚洲国内欧美| 亚洲欧美一区二区激情| 久久亚洲国产成人| 欧美片第1页综合| 国产欧美日韩视频| 亚洲欧洲一区二区天堂久久| 亚洲专区国产精品| 蜜桃久久精品乱码一区二区| 日韩一区二区福利| 久久九九久精品国产免费直播| 欧美激情视频给我| 国产午夜精品福利| 99热这里只有精品8| 久久国产精品99国产| 亚洲二区免费| 午夜精品久久久久| 欧美国产一区视频在线观看| 国产女人aaa级久久久级| 亚洲国产精品一区二区第一页 | 国产精品久久久久aaaa| 在线成人激情| 亚洲女同精品视频| 亚洲成人自拍视频| 午夜精品一区二区三区四区| 欧美成年人网站| 国产精品亚洲不卡a| 亚洲激情黄色| 久久激情五月丁香伊人| 日韩五码在线| 理论片一区二区在线| 国产亚洲精品7777| 亚洲网在线观看| 欧美激情一区二区三区在线视频| 午夜精品视频在线观看一区二区| 欧美日韩成人综合天天影院| 在线色欧美三级视频| 欧美影院午夜播放| av成人免费在线| 欧美高清成人| 亚洲国产美女久久久久| 久久精品免费观看| 在线亚洲一区| 欧美激情91| 亚洲国产精品va在线观看黑人| 欧美与欧洲交xxxx免费观看| 一本色道久久99精品综合| 欧美成人精品影院| 亚洲第一在线| 久久综合久久综合久久综合| 午夜伦欧美伦电影理论片| 国产精品初高中精品久久| 日韩亚洲在线| 欧美激情一区二区三区在线| 久久久青草青青国产亚洲免观| 国产亚洲一区二区三区在线播放 | 欧美激情视频网站| 亚洲国产精品专区久久| 久久免费国产精品| 欧美一区二区三区视频在线| 国产精品视频yy9099| 亚洲在线观看| 亚洲少妇最新在线视频| 欧美亚洲第一区| 亚洲永久字幕| 亚洲在线观看免费| 国产乱码精品一区二区三| 午夜欧美精品| 午夜激情亚洲| 国产综合久久久久影院| 久久一综合视频| 久久精品一区二区三区中文字幕 | 亚洲激情在线视频| 欧美搞黄网站| 夜夜嗨一区二区| 99re6这里只有精品| 国产精品wwwwww| 欧美一级专区免费大片| 欧美亚洲专区| 影音先锋亚洲精品| 欧美国产日本在线| 欧美激情成人在线| 亚洲午夜91| 亚洲欧美成人一区二区三区| 国产一区二区中文| 久久字幕精品一区| 你懂的国产精品永久在线| 夜夜嗨av一区二区三区中文字幕| 洋洋av久久久久久久一区| 国产女主播一区二区三区| 久久婷婷国产综合精品青草| 久久综合色影院| 99国产精品99久久久久久| 一区二区三区.www| 国产欧美一区视频| 男女精品网站| 欧美日韩视频第一区| 欧美在线视频播放| 久久久人成影片一区二区三区| 亚洲肉体裸体xxxx137| 99精品欧美一区二区三区综合在线| 国产精品自拍三区| 欧美成人免费播放| 欧美性片在线观看| 美日韩精品视频| 欧美日韩视频第一区| 欧美在线免费观看亚洲| 久久亚洲一区二区| 亚洲淫片在线视频| 久久亚洲综合色一区二区三区| 99在线精品观看| 性伦欧美刺激片在线观看| 亚洲精品国产欧美| 亚洲欧美区自拍先锋| 亚洲欧洲一区二区在线播放| 亚洲一区影院| 亚洲精品国产精品国自产观看浪潮| 一本色道久久综合精品竹菊 | 麻豆国产精品va在线观看不卡| 亚洲天堂视频在线观看| 久久精品国产一区二区三| 一区二区三区免费看| 久久精品成人欧美大片古装| 中文欧美在线视频| 久热精品视频在线观看一区| 亚洲欧美日本视频在线观看| 免费成人av在线看| 久久精品91| 欧美日韩国产美| 欧美阿v一级看视频| 国产精品一区久久| 亚洲另类视频| 在线日韩欧美| 亚洲欧美日韩中文播放| 一本久久综合| 免费视频一区二区三区在线观看| 午夜伦欧美伦电影理论片| 欧美成年人视频网站| 久久亚洲精品中文字幕冲田杏梨 | 噜噜噜噜噜久久久久久91| 欧美亚洲免费电影| 欧美日韩dvd在线观看| 蜜桃久久精品一区二区| 国产日韩精品一区观看| 一本色道久久99精品综合| 亚洲乱码久久| 久久亚洲综合网| 久久人人97超碰精品888| 国产精品视频一区二区高潮| 日韩一级大片在线| 亚洲最新在线视频| 欧美福利在线观看| 欧美成人亚洲| 亚洲成人在线视频播放| 欧美在线日韩精品| 欧美一区二区三区四区在线观看地址 | 乱码第一页成人| 国产手机视频精品| 午夜精品久久久久久久久久久| 亚洲一区二区三区精品视频| 欧美成人高清视频| 亚洲福利免费| 亚洲黄色成人久久久| 老司机午夜精品| 欧美不卡高清| 亚洲国产精品一区制服丝袜| 久久久国际精品| 久久免费视频观看| 国内精品久久久久伊人av| 欧美综合国产| 久久综合久久久久88| 一区二区在线免费观看|