日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
逼格極高的編程語言Haskell與范疇論

Haskell 是一門逼格極高的語言,這個評價肯定不為過,就我自身的經(jīng)歷及觀察而言,一般初學者如果沒有相關(guān)函數(shù)式編程的經(jīng)驗,入門直接接觸那些稀奇古怪的概念,簡直要跪下。現(xiàn)在回想起來,隱隱覺得初學者所擁有的命令式語言相關(guān)的知識和經(jīng)驗反而成了負擔,若能拋掉以往固有的觀念轉(zhuǎn)以全新的視角來看待這些怪東西,仿佛會更好接受些,真是莫名其妙。

創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)樂都,10多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

Bartosz Milewski 的博客上寫了很多關(guān)于 C++ 模板 與 Haskell 關(guān)系的相關(guān)文章,讀來真是受益良多,這位大哥很多年前就開始探討 c++ 模板編程與 Haskell 之間的微妙聯(lián)系,許多觀點讓人眼前一亮以至嘆為觀止,比如說從范疇論的角度來理解和解釋什么是單子(monad)(我接下來準備寫篇博客總結(jié)一下)。Bartosz 講 Haskell 喜歡從數(shù)學的角度來闡述,視角非同一般,當然他不是第一位這樣做的,事實上 Haskell 與數(shù)學本來就有著許多不得不說又說不清道不明的曖昧關(guān)系(住口!)。

范疇論基本概念

如果你是第一次聽說范疇論,看到這高大上的名字估計心里就會一咯噔,到底數(shù)學威力巨大,光是高等數(shù)學就讓很多人噩夢連連。和搞編程的一樣,數(shù)學家喜歡將問題不斷加以抽象從而將本質(zhì)問題抽取出來加以論證解決,范疇論就是這樣一門以抽象的方法來處理數(shù)學概念的學科,主要用于研究一些數(shù)學結(jié)構(gòu)之間的關(guān)系及聯(lián)系。

在范疇論里,一個范疇(category)指的是這樣一個東西,它由三部分組成:

  1. 一系列的對象(object).
  2. 一系列的態(tài)射(morphism).
  3. 一個組合(composition)操作符,用點(.)表示,用于將態(tài)射進行組合。

一個對象可以看成是一類東西,數(shù)學上的群,環(huán),甚至簡單的有理數(shù),無理數(shù)等都可以歸為一個對象,對應(yīng)到編程語言里,可以理解為一個類型,比如說整型,布爾型,類型事實上可以看成是值的集合,例如整型就是由 0,1,2...等組成的,因此范疇論里的對象簡單理解就可以看成是值(value)的集合。

一個態(tài)射指的是一種映射關(guān)系,簡單理解,態(tài)射的作用就是把一個對象 A 里的值 va 映射為 另一個對象 B 里的值 vb,這和代數(shù)里的映射概念是很相近的,因此也有單射,滿射等區(qū)分。態(tài)射的存在反映了對象內(nèi)部的結(jié)構(gòu),這是范疇論用來研究對象的主要手法:對象內(nèi)部的結(jié)構(gòu)特性是通過與別的對象的關(guān)系反映出來的,動靜是相對的,范疇論通過研究關(guān)系來達到探知對象的內(nèi)部結(jié)構(gòu)的目的。

組合操作符的作用是將兩個態(tài)射進行組合,例如,假設(shè)存在態(tài)射 f: A -> B, g: B -> C, 則 g.f : A -> c.

看!好像沒有想象中的復雜!一個結(jié)構(gòu)要想成為一個范疇, 除了必須包含上述三樣東西,它還要滿足以下三個限制:

  1. 態(tài)射要滿足結(jié)合律,即 f.(g.h) = (f.g).h。

  2. 態(tài)射在這個結(jié)構(gòu)必須是封閉的,也就是,如果存在態(tài)射 f, g,則必然存在 h = f.g。

  3. 對結(jié)構(gòu)中的每一個對象 A, 必須存在一個單位態(tài)射 Ia: A -> A, 對單位態(tài)射,顯然,對任意其它態(tài)射 f, f.I = f。

講完了!范疇論就這么點東西!-- 當然是不可能的,但暫時來說,知道這些就已經(jīng)很足夠了。

Haskell 中的范疇

在 Haskell 中存在著這樣一個唯一的范疇,名字稱為 Hask, 這個 Hask 滿足前面關(guān)于范疇的全部約定,因此是范疇論里一個純正的“范疇":

  1. 對象就是 Haskell 里的所有類型,記得類型是一個集合。

  2. 態(tài)射就是編程語言里的一般函數(shù)(function),如: func :: Int -> Bool,將對象 int 映射為 對象 bool。

  3. 態(tài)射的組合就是函數(shù)的組合,在 Haskell 里,函數(shù)也是通過點號(.)進行組合的。

另外三個約束條件很容易證明也是滿足,因此整個 Haskell 從數(shù)學的角度上看它就是一個范疇,這個角度的理解是很深刻的,這樣一來傳統(tǒng)意義上諸如語法,類型,函數(shù)等語言特性其實都只是這個內(nèi)在本質(zhì)的外在表現(xiàn)而已。

函子

前面對范疇的介紹反映了范疇內(nèi)部各個對象之間的聯(lián)系與相互作用,在范疇論里另外研究的重點是范疇與范疇之間的關(guān)系,就正如對象與對象之間有態(tài)射一樣,范疇與范疇之間也存在某些映射,從而可以將一個范疇映射為另一個范疇,這種映射在范疇論中叫作函子(functor),具體來說,對于給定的兩個范疇 A 和 B, 函子的作用有兩個:

  1. 將范疇 A 中的對象映射到范疇 B 中的對象。

  2. 將范疇 A 中的態(tài)射映射到范疇 B 中的態(tài)射。

顯然,函子反映了不同的范疇之間的內(nèi)在聯(lián)系,函子的定義是十分松散的,而不同范疇之間的關(guān)系有強有弱,一個隨便定義的函子很多時候并不能太深刻反映范疇之間結(jié)構(gòu)上的聯(lián)系,因此數(shù)學上,對函子通常有幾個限制,先假設(shè) F 是范疇 A 與范疇 B 上一個函子,則:

  1. 對范疇 A 上的單位態(tài)射Ia, F 必須將其映射為范疇 B 上的單位態(tài)射 Ib, F(Ia) = Ib.

  2. 函子對態(tài)射的組合必須滿足分配徤,即,假設(shè) f, g 是范疇 A 上的態(tài)射,則 F(f.h) = F(f).F(g)。

顯然這兩個限制是很強的,如果兩個范疇之間存在這樣一個函子,則反映了他們之間在結(jié)構(gòu)上有著很強的相似性,從看似風牛馬不相及的東西里找出他們內(nèi)在的相似性,數(shù)學家最愛干的事情了。

和態(tài)射一樣函子也可以是自映射的,即函子允許將范疇映射到其自身,這樣做有什么好處呢?不同范疇之間的映射反映了范疇間的相似性,范疇到范疇自身的映射則顯然是反映了范疇內(nèi)部的自相似性 --- 到底認識自己也不是一件容易的事啊。。。自相似性是大自然里美妙的存在,想想六角形的雪花,想想分形... 在范疇論里,這種將范疇映射到自身的函子被稱為自函子(endofunctor).

Haskell 中的函子

知道為什么要講自函子了嗎,Haskell 中只有一個范疇! 那么這個唯一的范疇 Hask 中,存不存在自函子呢?有的!終于講到重點了,為什么 Haskell 有這么些奇怪的概念? Haskell 的老鳥會告訴你,這些奇怪的東西都是寶貝,它們都是有本而來的。

那么 Haskell 中的自函子是怎么體現(xiàn)出來的呢? 根據(jù)前面的定義,一個函子其實就是一個映射,它把對象映射為對象,把態(tài)射映射為態(tài)射,我們知道在 Haskell 中對象就是一個類型,如整型,布爾型等,將一個類型映射為另一個類型,沒錯,就是 type constructor 在干的事情,c++ 的程序員可以用模板類來想象一下,如,vector 就是將 int 映射為 vector, 這是兩種不同的類型了,實例化模板的過程實際就是把一個類型變成另一個類型的過程。

注意不要把對象的映射與對象內(nèi)部的態(tài)射混淆了,態(tài)射是將對象內(nèi)部的值進行映射,而對象的映射(函子)是把對象這個整體映射為另一個對象,函子根本不關(guān)心一個對象內(nèi)部會有什么值。

顯然我們可以看到,在 Haskell 中,類型到類型的映射事實上并不是普遍存在的,自函子反映的是范疇內(nèi)部的結(jié)構(gòu)關(guān)系,這些關(guān)系并不是因為函子的存在而存在,函子只是揭示了這些內(nèi)在的關(guān)系。具體在 Haskell 中,類型間的關(guān)系并不是普遍存在的,比如說, Int -> Bool 就沒有對應(yīng)的映射關(guān)系,而存在映射關(guān)系的類型,它們都有一些共同的特點,映射雙方可以看成是由簡單的類型轉(zhuǎn)變?yōu)閺碗s的類型。

type constructor 就是自函子的一部分!

好了,現(xiàn)在類型到類型的映射在 Haskell 中找到了,那態(tài)射到態(tài)射之間的映射呢?必竟這也是函子的必要組成部分。

在 Haskell 中,態(tài)射就是一般的函數(shù),把一個函數(shù)映射為另一個函數(shù),聽起來不就是高階函數(shù)在干的事情嘛。具體來說,映射函數(shù)這件事發(fā)生在 Functor 這個 typeclass 里,連名字都一模一樣,目的昭然若揭。Haskell 中 Functor 是一個 typeclass,它的定義如下:

 
 
  1. class Functor f where
  2.   fmap:: (a -> b) -> f a -> fb

fmap 干嘛的?顯然就是用于把態(tài)射 (a -> b) 映射為態(tài)射 (f a -> f b)的,它把范疇里的態(tài)射映射到另一個態(tài)射,且遵守了函子在映射態(tài)射時所需要遵守的兩個原則。

講到這里,我們一步一步不知不覺就已經(jīng)向著 monad 靠近了,好激動,先打住了,回頭再整理整理。

【參考】

http://en.wikibooks.org/wiki/Haskell/Category_theory

http://bartoszmilewski.com/2011/01/09/monads-for-the-curious-programmer-part-1/

原文出自:http://www.cnblogs.com/catch/p/3973104.html


名稱欄目:逼格極高的編程語言Haskell與范疇論
本文鏈接:http://m.5511xx.com/article/dhihoco.html