參加 2017 年函數式編程聚會是什麼感受?

http://2017.fp-china.org/


去年也參加了: 第2屆函數式編程分享隨便記 坐在下面膜拜聚聚們, 今年終於上台把去年想講的 topic 完成, 算是有個交代 (

以下是腦內流水賬:

挺早去到, 但是進不去, 好像去錯樓準備上樓再看看的時候被邵老司機發現問我是不是參加 FP 分享會的, 然後贊了我的 SICP 衣服不錯. 到了之後發現是在一個會議室里開, 去年是在清華的課室, 反正人也不會太多.

--

第一個 @韓冬 的 Talk, 之前放出 topic 列表的時候還沒反應過來會是韓冬來講, 還在想國內還有人能講這個? 這次直接看真人而不是在視頻里看他講 Haskell 了 :D

看到"Haskell程序調優"我首先想起Johan Tibell幾個關於 Haskell 性能優化的綜合性演講. 總體感覺整個 talk 對於不懂一些 Haskell 技巧跟 GHC RTS 的話十分 hardcore, 韓冬對 GHC 實現的內存布局, IO Manager 機制都好熟悉, 而且牽涉到一點系統編程的東西. 優化點基本上還是那些, 怎麼 profile 拿數據, 怎麼 unboxing 利用 locality, 用對的數據結構, CPS(church encoding), Memorization, Fusion, FFI, 各種並發抽象的消耗之類的, 具體還是看視頻比較好. 中間比較有意思的是講 FFI 的時候對內存管理的討論, 這是很多提供 c binding 語言都會遇到的問題, FFI 里真是各種黑 233; 還有因為 typeclass specialized 的問題, 邵老司機指出這是因為 GHC 不支持 whole program optimization導致的, 不知道 link time optimization能不能做. IO優化方面是相當貼近實際工程的東西, 中間提到的 Vectorized IO, 我指出 Erlang 里已經全這麼幹了, Erlang 里有個叫 iolist 的東西, 大概就是把可以 IO 的東西放到列表裡用 writev 去塞了, 詳細可以看"Elixir and IO Lists".

P.S 後面 QA 部分有挺多爆笑的地方 :D

--

第二個是我講的"愛因斯坦搞煉丹(Elixir: A Haskeller"s Perspective)", 入門介紹向, 感覺準備得不是特別好, 我凌晨3點多還在填 slides XD. 主要是想講在用 Elixir 的時候一些從 Haskell 里來的既視感還有Haskell 里怎麼實現別的語言裡面一些比較方便的功能. 整個 talk 裡面還摻雜了不少函數式編程裡面的一些概念 idea: maybe/either monad 做 error handling, total/partial function, iteratee/reduce, (binary) pattern matching view pattern之類的 (

本來沒想黑 Scala, 然後講著講著就黑起來了, 變成意料之外的笑點 :D

最後提到的 Pretty Print 是個有意思的問題, 但是時間問題沒準備介紹了.

中間有同學打斷問 maybe/either monad 做 error handling 比用 Exception 有什麼區別, 感覺當時回答得不是很好, 其實感覺答 Exception 是 side effect 跟 Exception 不是 composable 的就差不多了 (

中間提到 Binary Pattern Matching 不是特別慢的 paper 是: Programming Efficiently with Binaries and Bit Strings (http://erlang.org/euc/07/papers/1700Gustafsson.pdf)

QA 里提到的一些鏈接

講 binary pattern matching 里韓冬提到的 Get Monad (https://downloads.haskell.org/~ghc/8.0.1/docs/html/libraries/binary-0.8.3.0/Data-Binary-Get.html)

帕琪提到的DataKind 的實現 https://gist.github.com/hsyl20/1a6643507e3b49620532090911c88ccc

Elixir 編譯器重構對多 backend 的支持

Start refactoring on elixir_compiler · elixir-lang/elixir@412d5f5Add elixir_erl_compiler · elixir-lang/elixir@102a8a3Move beam building to elixir_erl · elixir-lang/elixir@50e6487Support custom backends (undocumented behaviour for now) · elixir-lang/elixir@d1daf3e

Elixir 對 Erlang 社區的填補 Announcing GenStage

ekmett/intern Haskell 里用 OverLoadedStrings 實現 Interned String

https://hackage.haskell.org/package/pcre-light PCRE binding

---

TBD


講座:

&> 寒冬講 Haskell 性能調優,對工業 Haskeller 而言是不錯的總結,雖然涉及了不少 dirty tricks

&> 祖與占講 Elixir,現場配了環境試寫了幾行,因為沒有類型檢查(懶得調 dialyzer)感覺並沒有 Haskell 或者 ML 系語言的生產力,不過語言本身有些有意思的地方(比如有宏)

&> 賀師俊講 ES6 尾遞歸,結論是除了 Safari(JavaScriptCore)以外支持不佳,有待觀望。實測最新版 V8 開 harmony tail call 選項對 strict mode 的函數還是可以搶救一下的,不過呢個人覺得在 JS 裡面搞 FP 實際上尾遞歸沒有也罷。。另外高橋流報告法真是懶得做 ppt 的拖延症患者福音

&> 題葉講 ClojureScript,之前寫過一點,不過因為對動態語言無感所以了解也不深

&> 喻昌遠講 Nix 和 NixOS,個人感覺前半部分講語法的部分還是可以略過,以展示效果為主(比如寒冬提出跟 Docker 對比,這裡可以著重演示下,起一個 Nix shell 和起一個 Docker container 的開銷對比之類的,etc)

&> parker liu 講 TensorFlow 的 Haskell bindings,順帶安利了一波莎莎的 DDF。後面講 bindings 細節的部分感覺可以快進(也有可能是那時太餓了)。。

花絮:

&> 帕琪背著一把西洋劍來聽,特別帥氣可愛,然而還是沒女裝

&> 祖與占的 SICP 文化衫大受好評,現場群眾紛紛求團購

&> Neo 談了一些渣打的 Haskell 基礎設施相關的軼事

&> 大魔頭談了一些在 ThoughtWorks 做諮詢的心得。另外他看見我以後表示跟他(按頭像)想像的大不一樣

總的來說挺開心,見到一些老朋友,聊到感興趣的技術。

能聚一次算一次吧。且行且珍惜


只聽了一小會,收穫很多。

Elixir很贊。SICP的T-shirt也非常贊。

特別是elixir的那個 WITH 語句,解決case hell,非常實用。

於是我在scheme裡面寫了一個:

ChaosEternal/and-let-values

其實按照scheme的特性,老早之前的srfi-2 : and-let* 就可以了,不過為了讓語法跟elixir更接近,所以才有這個。一切語言都是scheme的語法糖啊。。。

另外還有個收穫,一直在想,如果在scheme裡面做erlang的otp的話,那異常怎麼安全的捕獲,特別是調FFI的過程中發生的segv, 怎麼抓的住。

結果人家OTP也不管FFI裡面的異常!

這特么太贊了。


@賀師俊 老師的分享特別有意思!

補一句,中午那頓很不錯,可惜賀老師錯過了。


見到了很多原本(現實中)不認識的巨巨,自己的知識水平還是需要提高。

蒟蒻所見的第三屆函數式編程分享


去了才知道fp的聚會是可以帶歐式長劍的,下次去要租一把(捂臉)


推薦閱讀:

微軟和 Haskell 之間有什麼關係?
函數式編程所倡導使用的「不可變數據結構」如何保證性能?
函數式編程語言該如何表示樹結構呢?
每一個 Haskell 中的「範疇論的」概念都可以去 co 嗎?
Haskell的Lens是一個怎樣的庫?

TAG:函數式編程 | Haskell | Clojure | Elixir |