序丨寫給程序猿的範疇論(一)

2021-02-20 SegmentFault

【編者按】 給程式設計師寫範疇論聽上去是一件瘋狂的事情,但 Bartosz Milewski 就這麼做了。今天為大家分享的是小夥伴 @garfileo 翻譯自 Bartosz Milewski 的《Category Theory for Programmers》序部分,接下來還會為大家帶來《複合的本質》、《類型與函數》等文章。

以下是序部分的翻譯內容。



我打算為程式設計師們寫一本講範疇論的書已經有一段時間了。注意,受眾不是計算機科學家,而是程序猿——是工程師,而不是科學家。這聽起來挺瘋狂,我也有些誠惶誠恐,但是我無法容忍科學與工程之間存在著巨大的鴻溝,更何況我自身的工作也是經常需要我在這兩個世界中穿梭。不過,要解釋一些東西,總讓我感覺非常窘迫。我非常敬仰 Richard Feynman(理察·費恩曼),在講授知識方面他是深入淺出的大師。我不是 Feynman,但我會盡力。我從發布這篇序言開始,激勵讀者學習範疇論,希望能引發一些討論並得到一些反饋意見。

下面我要用幾段文字讓你相信,這本書是寫給你的。根本沒必要擔心它是幾乎會耗盡你所有的業餘時間的一門最抽象的數學。

我的樂觀來自一些觀察。首先,範疇論是相當有用的編程思想寶藏。Haskell 程式設計師們已經涉足此境很久了,其中的一些思想正慢慢的滲入其他語言,只是這一過程是非常緩慢而已,我們需要使之加速。

其次,有許多種數學,它們面向不同受眾。你可能不喜歡代數學,但這並不意味這你無法喜歡範疇論。我會向你展示,範疇論非常適合程序猿的思維。因為範疇論處理的對象不是計算細節,而是結構。它處理的是使程序可複合的結構。

複合是範疇論的精髓,它也是範疇論自身定義的一部分。我會證明編程的本質是『複合』。我們一直都在組合一些東西,這種行為從很久以前一群偉大的工程師提出子程序的時代就開始了。很久以前,結構化編程原理掀起了編程的革命,它立足於代碼級別的複合。伴隨面向對象編程而來的則是對象的複合。函數式編程不僅僅使得函數與代數樹覺結構可以複合從而使得它們能夠實現對並發計算的支持,它還提供了其他編程範式難以支持的東西。

第三,我有秘密武器,一把庖丁之刀,我要用它將數學大卸八塊使之成為程序猿的美味佳餚。如果你是數學家,你不得不大膽假設,小心求證,嚴格的構造你的定理,然後產生令外人難以卒讀的論文與專著。我是訓練有素的物理學家,在物理學中,我們使用著並不正規的推理來取得令人激動的發現。數學家們嘲笑偉大的物理學家 P. A. M. Dirac 為求解一些微分方程而提出的狄拉克 δ 函數,但是當他們發現了一個叫做廣義函數論的新的數學分支時,他們就不笑了,因為廣義函數論只是對 Dirac 觀點的一種形式化描述。

當然,採用不嚴肅的論證方式很容易產生謬論。因此在這本書中凡是遇到不正式的論證時我會盡力確定其背後存在著相應的實際數學理論。我床頭有一本被我翻的破破爛爛的 Saunders Mac Lane 寫的《Category Theory for the Working Mathematician》。

由於這本書是寫給程式設計師的範疇論,因此我將會用電腦程式代碼展現範疇論的主要概念。你可能會擔心函數式語言會比傳統的命令式語言更接近數學,並認為前者為此已經提供了更多的抽象能力,所以想當然的認為只有學習了 Haskell 方能將範疇論的能量作用於現實,或者認為範疇論在函數式編程範式之外沒有什麼用處,這些看法並不正確。我會提供大量的 C++ 的例子,只不過你得容忍一些醜陋的語法,需要在繁瑣的代碼中探尋清晰的模式,並且在更高層抽象的場合不得不做一些複製與粘帖的工作,不過這也正是大部分 C++ 程式設計師經常幹的事。

不過,你也無法脫離 Haskell 的羈絆。雖然沒有必要成為一名 Haskell 程式設計師,但你需要將 Haskell 作為一種草圖性的語言,用於描述那些 C++ 示例的實現思想。這也正是我當初開始學習 Haskell 的所用的方法。Haskell 簡潔扼要的語法與強大的類型系統,對於理解與實現 C++ 模板、數據結構與算法非常有幫助。當然,我不可能要求讀者事先以已經了解 Haskell,我會逐步介紹 Haskell 的知識,並且會對我所用到的那部分 Haskell 代碼給出詳細的解釋。

如果你是一名有經驗的程式設計師,可能會自問:即使不懂範疇論與函數式方法,我也照樣寫代碼,似乎沒什麼必要學習它們。的確如此,不過你無法阻止正在侵入命令式語言的那股沉穩的函數式潮流。即使是 Java,面向對象編程的堅固堡壘,也拱手請來了 Lambda。C++ 也正在大踏步前進,現在每隔三五年就發布一個新標準,它正在嘗試趕上這個正在變化的世界。這一切都在為一場變革而準備,這種變革,用我們物理學家的術語可稱為相變。如果你持續的燒水,它最終會沸騰。我們現在正處於青蛙的位置,必須決定是在升溫的水中繼續遊動,還是開始作出其他抉擇。


驅動編程範式產生巨大變革的力量之一是多核革命。主流的編程範式——面向對象編程已經難以勝任並發與並行計算領域,它只會造成危險且充滿 bug 的設計。數據隱藏,是面向對象的基本前提,一旦對象被共享且被修改,就會造成數據競爭。將數據與互斥鎖組合起來看似是個不錯的解決方案,但不幸的是,互斥鎖不支持複合,並且一旦在數據競爭中出現死鎖,便非常難以調試。

對於非並發計算,軟體系統日益遞增的複雜度也正在炙烤著命令式編程範式。簡而言之,副作用正在失去控制。有副作用的函數便於理解與編寫的。原則上,有副作用的函數所產生的影響可在函數名以及注釋中予以標明。一個叫做 SetPassword 或 WriteFile 的函數顯然在修改某種狀態並產生副作用,對此我們已經非常習慣且不以為然。只有當我們開始將這些有副作用的函數層層組裝到一起,事情就開始變得棘手了。副作用本身並不壞,但是將它們塞到一個大尺度視圖中,我們很難再看清它們,因此它們也就脫離了我們的掌控。完全與副作用打交道的命令式編程範式,副作用無法剝離。

硬體的變化與軟體複雜度的增長都在迫使我們重新思考編程的根本思想。正如歐洲最宏偉的哥德式大教堂的建造者那樣,我們正在面對著原料與結構的限制而磨礪著我們的技藝。法國的博韋有一座未完工的哥德式教堂,它就是人類與限制作鬥爭的見證。這座教堂的設計企圖在高度與採光方面擊敗所有的教堂,但是建造中卻出現了一系列的崩塌。當時不得不用鋼梁木柱臨時做成支撐架構來阻止崩塌,但是於事無補,因為很多東西在設計上就是錯的。從現代的視角來看,博韋教堂是個奇蹟,其相當多的一部分哥德式結構已經成功的建造了出來,這在那個沒有現代材料科學、計算機建模、有限元分析甚至沒有普通的數學與物理的時代顯得有些不可思議。我期望我們的後代也會敬佩我們在構建複雜的作業系統、網絡伺服器以及網際網路架構中展現出來的技術。毫不客氣的說,他們理應如此,因為我們是在脆弱的理論基礎上完成的這一切。但是,如果我們想繼續前進,那麼就必須修正現有的理論基礎。


-EOF-

閱讀原文 提前 get 更多專屬程序猿的範疇論,做一個上進的程序猿。

專業的開發者技術社區

多樣化線上知識交流

豐富線下活動和給力工作機會

相關焦點

  • 構建數學和物理基礎的範疇論:用「等價」取代「相等」丨眾妙之門
    這種關注等價性的數學理論就是所謂的範疇論(category theory)。數學家 Jacob Lurie 先後寫作了944頁的《高階範疇論》和1553頁的《高階代數》來闡述範疇論的思想,這兩本程碑式著作的影響被認為堪與格羅滕迪克的代數幾何革命相提並論。但新思想的提出也帶來了巨大的挑戰:數學界要如何吸收這些新知識?當數學被重新書寫時,數學家群體要如何應對?
  • 【常年公告】「中國憲法學基本範疇與方法學術研討會」 主題範疇、主旨報告徵集
    (一)主題範疇上屆會議之後抓緊敲定,確保更充分的時間募集論文。(二) 主旨發言人與主旨報告1.一天半的研討會,每半天一單元一範疇一報告,提高主題範疇聚焦與主旨報告聚焦的雙聚焦。近六屆會議主題範疇與主旨報告論文第十六屆主題範疇(2020,線上):「基本經濟制度」(圍繞經濟憲法範疇體系、按勞分配、社會主義市場經濟設置單元)李忠夏:《「經濟條款」的憲法解釋:經濟憲法範疇論綱》李響:《我國憲法上「按勞分配」範疇的規範內涵探析
  • 俞豐 | 虞世南《破邪論序》詳解
    明張醜《真跡日錄》卷一載:「虞永興小楷破邪論。按此系已刻《書畫舫》,今刪。」似當時仍有墨跡傳世。此帖後世輾轉翻刻者甚多,有《潭帖》《寶晉齋帖》《玉煙堂帖》《停雲館帖》等刻本,尤以傳為「越州石氏本」者為最佳。
  • 上 | 完整解釋 Monad -- 程式設計師範疇論入門
    最後,我會介紹 Monad 在範疇論中的意義,並簡單介紹下範疇論。函數組合1. Monoid假設你被一個奇怪的叢林部落抓住了,部落長老知道你是程式設計師,要你寫個應用,寫出來就放你走。作為一個資深碼農,你暗自竊喜,心裡想著老夫經歷了這麼多年產品經理各種變態需求的千錘百鍊,沒什麼需求能難倒我!長老似乎看出了你的心思,加了一個要求:這個應用只能用純函數寫,不能有狀態機,不能有副作用!
  • 長知識丨《蘭亭序》到底是什麼序
    晉穆帝永和九年(353),王羲之與謝安一眾42人雅集蘭亭,流觴曲水,賦詩怡情,各有所詠。酒酣耳熱之後,眾人擬將詩作結集,共推王羲之為序。右軍先生欣然命筆,洋洋灑灑,有如神助,文墨高妙,為後人留下傳頌千古的書法和散文名篇。
  • 《蘭亭序》背後的秘密(下)
    直至當代的「蘭亭論辨」,讓人覺得,蘭亭集會仿佛是一個千年的長會,至今,仍然沒有散會的跡象。在1700多年的歷史長河中,圍繞「蘭亭序」,發生了太多的事情。《蘭亭序》手稿真跡到底在那裡?永和九年開會那天到底是四十一人還是四十二人?
  • 文學中的體裁源自拉丁文,又稱作文類,是一個歷史範疇和文化範疇
    《詩經》劃分有風雅頌三個部分對文體的劃分最早出現在魏晉時期,曹丕的《典論·論文》將文劃分為四類八體,並指出它們「本同而末異」。《文心雕龍》再後來,明代吳納的《文章辨體》、徐師曾的《文體明辨》等對這一問題做過總結。應該說,中國的文體劃分在產生之時就不是現代意義上的,帶有實用性。
  • 秩序與詞序的跨層對應-光明日報-光明網
    「雌雄」形式明顯表現出了三點:一是詞序上陰性在前、陽性在後;二是範圍上人與動植物不分顯現了其文明程度不高的思維特性;三是詞序的基礎為母權制社會秩序。    牝牡。同「雌雄」的表現相類似。「牝牡」的文字解釋亦始於動物範疇。《說文》:「牝,畜母也,從牛匕聲。」「牡,畜父也,從牛土聲。」郭沫若《甲骨文字研究》:「卜辭牡牝字無定形,牛羊犬豕馬鹿均隨類賦形,而不盡從牛作。」
  • 《破解黃光國難題的知識論策略》主編序⊙陳復與黃光國
    《破解黃光國難題的知識論策略》主編序序文 | 陳復與黃光國 本書《破解黃光國難題的知識論策略》系我們思源學圈的同道三年多來研究與辯論內容的結集成冊,早在公元2016《破解黃光國難題的知識論策略》書籍 圖丨由陳復教授提供首先,黃光國根據自己和李維倫、林耀盛、葉光輝與陳復等人持續對話的內容,撰成《儒家文化系統的主體辯證》一書,書中回顧臺灣心理學本土化運動在過去三十年間曾經出現過的五種「文化主體策略」,並從科學哲學的角度分別加以批判。
  • 做程序猿的老婆應該注意的一些事情
    當時不小心裝偽文藝參加了吉他社,想借一本吉他入門書,然後同在吉他社熱心的海哥說他一同學有,就帶著我去拿書了。於是我們第一次「見面」了,我只看見一個對著電腦,佝僂著背的背影……嚴重懷疑程序猿根本沒抬頭看一眼那個已經曬得像反轉熊貓一樣的妹子,因為他遞過來書以後,又迅速投入到了電腦的懷抱,相對應的,我也不記得他長什麼樣了。我從來沒有讀懂過這個上天用那個背影給我的預警,於是墮入了一生的深淵。
  • 零基礎馴養一頭程序猿:從入門到結婚(上)
    剛剛跳穩了槽漲薪 50% 的程序猿,正神情舒緩地在新公司裡通宵加著班。經驗豐富的獵手們知道,這是一年中捕獲一頭程序猿的最好時機。不知何時,擁有一頭程序猿成為了一件非常值得驕傲自豪的事情。雖然程序猿群體經常被戲稱「找不到對象」,但還是有不少姑娘(漢子)想要擁有一頭屬於自己的猿。
  • 《啟功論書絕句百首》:4 蘭亭集序神龍與定武
    啟功先生的《啟功論書絕句百首》,是我們當代非常優秀的書論。此書不但有絕句百首,更是有啟功先生的自注。本文是《啟功論書絕句百首》第四首,啟老沒有起標題,此首主要說,蘭亭集序神龍與定武。【啟功自注】王羲之等若干人在會稽山陰蘭亭水邊修禊賦詩事,早有文獻記載,蘭亭序帖,乃當日諸人賦詩卷前之序。流傳至唐太宗時,命拓書人分別鉤摹,成為副本。摹手有工有拙,且有直接鉤摹或間接鉤摹之不同,因而藝術效果往往懸殊。今日故宮博物院所藏有神龍半印之本,清代題為馮承素摹本,筆法轉折,最見神採。
  • 秩序與詞序
    現實生活中的秩序觀念,在類比思維作用下,投射到反映現實社會生活的詞語系統中,就成了與社會秩序觀念相應秩序範疇諸類詞語的詞序形式。這樣,傳統社會秩序觀念就成為漢語秩序範疇諸類詞語詞序的文化基礎。  漢民族秩序觀念主要體現在上古以儒家為代表的經典著作之中。
  • 郭沫若提出的《蘭亭序》真偽論有道理嗎?各位網友你怎麼看
    因為墓主王興之是王羲之的叔伯兄弟,又是同時代人(墓石刻於晉成帝鹹康七年,公元三四一年),故郭沫若先生據此在一九六五年第六期《文物》上發表了《由王謝墓誌的出土論到蘭亭序的真偽》一文,質疑《蘭亭序》存在的真實性。其實郭沫若關於《蘭亭序》的真偽論辯不過是舊瓶裝新酒罷了,歷史關於《蘭亭序》的真偽早有爭論,只不過郭沫若看到了新出土的碑刻,所以又重新把這個問題提了出來。
  • 聯想、比較與思考:費孝通「天人合 一論」與人類學「本體論轉向」
    《鄉土中國》闡釋了「差序格局」概念;正是在這個語境裡,該書重點論述到「己」字的社會屬性。「差序格局」是指中國社會的結構理想型。今日學者多半喜歡賦予這個概念以結構性含義(在這個意義上,「差序格局」時常被界定為以「自我」或「主體」為中心形成的圈層式關係網絡和縱橫交錯的分層次序)。
  • 論「新柏拉圖主義」對亞里斯多德《範疇篇》中第一實體「優先性」的解釋
    比如,一些學者就認為《範疇篇》屬於亞里斯多德的早期思想,而《形上學》的一些章節屬於後期,因此關於「第一實體」才有不同的理解。與「發生學」的思路相比,新柏拉圖主義更傾向於一種「整體論」的方法。本文的基本目標是考察新柏拉圖主義這種解決思路,它或許能夠為我們更好地理解亞里斯多德哲學提供某種幫助。一、第一實體:個別的還是普遍的?
  • 程式設計師鼓勵師 美女端茶倒水擦汗程序猿的春天
    程式設計師鼓勵師 美女端茶倒水擦汗程序猿的春天時間:2015-04-02 16:14   來源:華東在線   責任編輯:毛青青 川北在線核心提示:原題:程序猿的春天:約聘網等招聘網站驚現程式設計師鼓勵師年薪10萬來源:天涯社區 導讀:【程式設計師鼓勵師 美女端茶倒水擦汗程序猿的春天】今年的網際網路界比較逗,各招聘網站相繼出現程式設計師鼓勵師
  • 張岱年的「中國哲學概念範疇」研究
    這一理論特質集中體現在《中國哲學大綱》一書中。在《中國哲學大綱》中,張岱年先生以哲學問題為綱,把中國哲學的發展歷史看作是諸多哲學問題衍變、流轉的歷史,書寫了一部中國哲學史。在這部書的《自序》中,張岱年先生特別強調了中國哲學研究的四個方法論原則,而其中的「析其辭命意謂」原則就是對哲學問題中概念範疇的確切內涵進行精密地解析。
  • 興安萬裡·閱讀有你丨《寫給兒童的百科全書》生活中很多的疑問都...
    興安萬裡·閱讀有你丨《寫給兒童的百科全書》生活中很多的疑問都在這裡 2020-12-21 11:28 來源:澎湃新聞·澎湃號·政務
  • 基本經濟制度丨第十六屆憲法學基本範疇與方法學術研討會綜述
    聚焦三個範疇專題一整天近八個小時的研討會,圍繞如下四篇未刊的範疇會議新作展開:李忠夏:《「經濟條款」的憲法解釋:經濟憲法範疇論綱》李響:《我國憲法上「按勞分配」範疇的規範內涵探析》閻天:《憲法按勞分配範疇的當代意涵》