查看完整版本 : 學習 Haskell

assembly.jc 2018-10-9 13:11

學了 Haskell 差不多 5 個月,開始慢慢習慣它的運作方式。對比其他 language,它真的比較難精通,一般的 language 5 個月應該掌握得 8 8, 9 9,但 Haskell 估計只掌握到 5 成左右。

但花咁多時間去學,值得嗎? 小弟唔想再講它的好處,因之前已講得太多。這裡反而想說一下不足的地方。
第一點,是它的效能。
Binarization 圖像處理,實作 Bernsen, Sauvola 的算法,就算 compile to binary format (.exe),都比 C, Java 慢 1 至 2 倍。
文件上的處理,實作類似 Linux find command,在 2000多個 directories 入面 (約 18000 個 files) 找特定的 files,需時 5-6 秒。用返 Linux find command,只需 1-2 秒,用 windows file explore 也只需 2-3秒。

圖像處理基本上唔可能用返 Haskell 傳統的 List, Lazy, immutable 方式去 implement,太慢了! Haskell 提供 Mutable Array 去處理這些問題,compile to exe 後 (需做 optimization -O2),基本上和 C 分別不大,但係! GC 的開銷居然比處理圖像大幾倍。什麼意思呢? 用返上面 Binarization 的例子,用在 binarization 的時間只需 0.2 秒,但 GC 已經花了 0.8 秒。

assembly.jc 2018-10-10 12:52

第二點為人詬病的地方是它的 Library ([url=https://hackage.haskell.org/]https://hackage.haskell.org/[/url]) 有不一致和 backward compatibility 的問題。

又例如,類似 List 的 data structure 超過 3 種 (Data.Vector, Data.Array, Data.Sequence ...),雖然它們都有它的特殊用途,但有些 programmer 覺得這些 data structure 缺乏統一的存取介面。
如 access 第一個 element:
List : a !! 1
Vector, Array: a ! 1
Sequence : a !? 1

加 element 在開頭的位置:
List: 1 : []
Sequence: 1 <| a

Concat two list, sequence
List: [1..5] ++ [6..10]
Sequence: a >< b

Backward compatibility 小弟再舉一例: System.Directory package,早期版本取 file 最後的修改日期,用 的是 modified function,新版變成 getModificationTime,modified 就消失了。

Haskell 係有 Backward compatibility 的問題,library update 後某些 installed Packages 可能會唔 work,所以整左個 sandbox installation 出來,這方面小弟所知不多,希望日後有時間研究一下。

不竟 Haskage 的 packages 都是 open source,有超過 1000 programmer 不求回報提供 packages 和協助解答使用的問題,可以說是有統一的管理,但無統一的設計。不像 Java, dotnet, swift 等有單一的機構管理和設計 official Library。

[[i] 本帖最後由 assembly.jc 於 2023-10-22 03:48 編輯 [/i]]

Susan﹏汪汪 2018-10-10 12:58

Swift會改API、而且改得好烈

而家Swift 3 ~ Swift 4.2流暢的語法
都是犧牲backward compatibility得來

assembly.jc 2018-10-10 13:22

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-10-10 12:58 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488703394&ptid=27769456][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Swift會改API、而且改得好烈

而家Swift 3 ~ Swift 4.2流暢的語法
都是犧牲backward compatibility得來 [/quote]

類似 Python 有個 clear cut 吧? 即 Python 2.7 和 Python 3.x 明顯分開左 2 條 branch。但 Haskage 沒有。

另外,汪兄覺唔覺 Swift operator overload declare 有點繁瑣,你之前帖出來的例子:[url=https://computer.discuss.com.hk/viewthread.php?tid=27746869&page=2#pid488430181]https://computer.discuss.com.hk/viewthread.php?tid=27746869&page=2#pid488430181[/url]

而且,Collection 包括 Set 之類無 order 的 collections 嗎? 如果包,要保證個 binary operation 是 Associativity 個結果先正確。

[[i] 本帖最後由 assembly.jc 於 2018-10-10 01:30 PM 編輯 [/i]]

Susan﹏汪汪 2018-10-10 13:28

[quote]原帖由 [i]assembly.jc[/i] 於 2018-10-10 01:22 PM 發表 [url=https://www.discuss.com.hk/redirect.php?goto=findpost&pid=488704648&ptid=27769456][img]https://www.discuss.com.hk/images/common/back.gif[/img][/url]


類似 Python 有個 clear cut 吧? 即 Python 2.7 和 Python 3.x 明顯分開左 2 條 branch。但 Haskage 沒有。 [/quote]
Swift都只有一直改版落去
只是自從swift 3大改版之後、語法都穩定一D

但swift 3都未必完成兼容swift 4
Swift 4又未必完全兼容swift 4.1
Swift 4.1又未必完全兼容swift 4.2

有些位置都依然會有出入

Susan﹏汪汪 2018-10-10 13:30

[quote]原帖由 [i]assembly.jc[/i] 於 2018-10-10 01:22 PM 發表 [url=https://www.discuss.com.hk/redirect.php?goto=findpost&pid=488704648&ptid=27769456][img]https://www.discuss.com.hk/images/common/back.gif[/img][/url]


類似 Python 有個 clear cut 吧? 即 Python 2.7 和 Python 3.x 明顯分開左 2 條 branch。但 Haskage 沒有。

另外,汪兄覺唔覺 Swift operator overload declare 有點繁瑣,你之前帖出來的例子:https://computer.discuss.com.hk/viewthread.php?tid=277 ... [/quote]
operator overload declare 果個
只是其中一種寫法

標準global generic function 形式的寫法
放入extension 以POP方式可以縮短個function名的長度

或者放棄generic的話再可以更多不同寫法

[[i] 本帖最後由 Susan﹏汪汪 於 2018-10-10 01:32 PM 編輯 [/i]]

Susan﹏汪汪 2018-10-10 13:34

[quote]原帖由 [i]assembly.jc[/i] 於 2018-10-10 01:22 PM 發表 [url=https://www.discuss.com.hk/redirect.php?goto=findpost&pid=488704648&ptid=27769456][img]https://www.discuss.com.hk/images/common/back.gif[/img][/url]


類似 Python 有個 clear cut 吧? 即 Python 2.7 和 Python 3.x 明顯分開左 2 條 branch。但 Haskage 沒有。

另外,汪兄覺唔覺 Swift operator overload declare 有點繁瑣,你之前帖出來的例子:https://computer.discuss.com.hk/viewthread.php?tid=277 ... [/quote]
Collection 包埋 Set

assembly.jc 2018-10-10 13:36

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-10-10 01:28 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488704992&ptid=27769456][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

Swift都只有一直改版落去
只是自從swift 3大改版之後、語法都穩定一D

但swift 3都未必完成兼容swift 4
Swift 4又未必完全兼容swift 4.1
Swift 4.1又未必完全兼容swift 4.2

有些位置都依然會有出入 ... [/quote]

咁都幾煩 (從 maintain 的角度),這方面 Java 做得好些。

assembly.jc 2018-10-10 14:11

[quote]Collection 包埋 Set [/quote]
咁 減和除法 就未必有正確的結果。
如:
(1-2)-3 = -4
(3-2)-1 = 0
[quote]者放棄generic的話再可以更多不同寫法 ... [/quote]
未必要 generic,就算 generic,都必要是有 Order 的 collection 吧 (原因如上)。另外,如果個 Collection 無 element,return 什麼? throw exception?

[[i] 本帖最後由 assembly.jc 於 2018-10-10 02:13 PM 編輯 [/i]]

Susan﹏汪汪 2018-10-10 14:20

[quote]原帖由 [i]assembly.jc[/i] 於 2018-10-10 02:11 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488707532&ptid=27769456][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

咁 減和除法 就未必有正確的結果。
如:
(1-2)-3 = -4
(3-2)-1 = 0

未必要 generic,就算 generic,都必要是有 Order 的 collection 吧 (原因如上)。另外,如果個 Collection 無 element,return 什麼? throw exception? ... [/quote]
同之前的完全一樣, 只是變個寫法
[attach]8867075[/attach]

中間的elements.first!
有個感嘆號表示force unwrap
就是如果elements.first呢個optional是nil就會彈error
[attach]8867074[/attach]

如果改做optional result都可以[attach]8867081[/attach]

[[i] 本帖最後由 Susan﹏汪汪 於 2018-10-10 02:21 PM 編輯 [/i]]

Susan﹏汪汪 2018-10-10 14:24

[quote]原帖由 [i]assembly.jc[/i] 於 2018-10-10 02:11 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488707532&ptid=27769456][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

咁 減和除法 就未必有正確的結果。
如:
(1-2)-3 = -4
(3-2)-1 = 0

未必要 generic,就算 generic,都必要是有 Order 的 collection 吧 (原因如上)。另外,如果個 Collection 無 element,return 什麼? throw exception? ... [/quote]
如果唔洗generic
之前也講過" 1... "可以代表由一開始至無限[code]func / (_ op: (Int, Int) -> Int, _ elements: [Int]) -> Int {
    return elements[1...].reduce(elements[0], op)
}[/code]

assembly.jc 2018-10-11 13:39

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-10-10 02:20 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488708028&ptid=27769456][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

同之前的完全一樣, 只是變個寫法
8867075

中間的elements.first!
有個感嘆號表示force unwrap
就是如果elements.first呢個optional是nil就會彈error
8867074

如果改做optional result都可以8867081 ... [/quote]
這個是 extension 的寫法? 好奇問下,是否只有 interface 才可以用 extension?

居然忘記左有 null (nil 即係 null?) 這條萬能 key。但出 error 會好 d。

assembly.jc 2018-10-11 13:46

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2018-10-10 02:24 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488708252&ptid=27769456][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

如果唔洗generic
之前也講過" 1... "可以代表由一開始至無限func / (_ op: (Int, Int) -> Int, _ elements: ) -> Int {
    return elements[1...].reduce(elements[0], op)
} ... [/quote]
誤會左。以為是 generalize 個 container (即 collection)。

如果按 J Insert function 來 implement,只用 List 就夠,但 elements 需 generic。因任何 operator 都可以 passed as an argument of Insert function。當然 elements 可被 operator 操作。

Susan﹏汪汪 2018-10-11 13:53

[quote]原帖由 [i]assembly.jc[/i] 於 2018-10-11 01:39 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=488770861&ptid=27769456][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]

這個是 extension 的寫法? 好奇問下,是否只有 interface 才可以用 extension?

居然忘記左有 null (nil 即係 null?) 這條萬能 key。但出 error 會好 d。 [/quote]
nil 即是 null

Swift的語法一睇就非常清楚、冇乜地方會出現感嘆號
只有!= 、!==、!bool和optional!
一見到variables後面出現感嘆號就知道呢個位置隨時可能彈error

而另方面、如果汪汪寫elements.first忘記左加感嘆號
Xcode會呱呱嘈話elements.first放唔到入.reduce(elements.first) { /* .... */ }
叫你一係加感嘆號、一係寫返if condition去unwrap
呢個係static type 的好處

也因為咁、其實由一開始汪汪寫左感嘆號出來就已經知道結果
也冇忘記到係可以改用optional result
通常寫swift也唔會忘記處理nil

==========

extension可以用係任何protocol, struct, enum, class等等的所有types
係Protocol-Oriented Programming的基礎技術

[[i] 本帖最後由 Susan﹏汪汪 於 2018-10-11 06:24 PM 編輯 [/i]]
頁: [1]
查看完整版本: 學習 Haskell