1 | module Foo |
是否曾經疑惑過寫在 module 中的程式碼會在何時被載入呢?
繼續閱讀1 | module Foo |
是否曾經疑惑過寫在 module 中的程式碼會在何時被載入呢?
繼續閱讀依函式分派(dispatch on function)算是在 Julia 語言中相當常見的一個技巧,它依賴 Julia 的多重分派機制(multiple dispatch),可以依據不同的函式有不一樣的行為。
在資料分析或是資料庫分析中,常常會需要對資料欄位進行聚合運算,像是加總的 sum
、平均的 avg
或是計數的 count
。他們都是用同一個欄位的資料,聚合成一個值輸出。當我們需要將資料相加時,我們會寫出以下的程式碼:
1 | a = [1,2,3,4,5] |
這看起來很直觀,但往往在資料庫的設計當中,只會設計一些常用到的聚合函式(aggregate function)。
那麼有沒有一個方式可以得到一個比較廣義的聚合函式呢?
繼續閱讀依型別分派(dispatch on types)算是在 Julia 語言中相當常見的一個技巧,它依賴 Julia 的多重分派機制(multiple dispatch),可以依據不同的型別有不一樣的行為。
依據不同的型別有不同的行為,而不是實體。直觀上看起來會有點像傳統物件導向當中的 class method,不過在 Julia 當中還有更多用途。
繼續閱讀在 Julia 中存取物件的欄位的時候,設計者會想要對於存取的過程中加上一些檢查,這個想法是來自於傳統物件導向 getter/setter 的概念。
例如,在自己設計的物件當中有兩個矩陣,這兩個矩陣可以讓使用者隨意更新,但是需要保證這兩個矩陣的維度是一致的。這個時候就需要在使用者更新矩陣的時候加入檢查,以確保兩個矩陣之間的維度是一致的,如果檢查不通過,可能會跳例外或者是不讓矩陣被更新。
繼續閱讀這個問題在官方文件中並沒有詳細記載,所以覺得值得紀錄一下。
查閱 @async
的文件會講說,他會用一個 Task
把後面的表達式包裝起來,並且將他掛到排程器的佇列(queue)中。意思就是將表達式包裝成一個任務,並放到佇列中等待 CPU 核心的資源來執行他。
本篇文章是啟發自 The Expression Problem and its solutions,當中談論的是在撰寫程式的過程中,所採用的程式典範不同,會在程式表達上遇到不同程度的困難,稱之為表達問題(expression problem)。
繼續閱讀我們都知道要將兩個 Array
接起來要用 append!
,要將兩個 Set
合併起來要用 union!
,但要將 Dict
合併起來要用什麼呢?
答案是 merge!
廢話不多說,我們看範例:
1 | julia> a = Dict(:a => "A", :b => "B") |
merge
可以將兩個 Dict
合併起來,並且產生一個新的 Dict
。
有另一個函式 merge!
可以支援 in-place 版本的合併。
1 | julia> a |
如果要合併的兩個字典當中有重複的鍵出現的話,會發生什麼事呢?
1 | julia> c = Dict(:b => "C", :d => "D") |
答案是會被後者蓋掉。
merge
也可以用在 NamedTuple 上。
1 | julia> a = (a="A", b="B") |
接下來介紹一個更好用的函式 mergewith。
上面我們介紹的 merge
遇到相同的鍵,會把彼此蓋掉的行為,但有時候我們希望他們可以合併。
不囉唆,我們看範例:
1 | julia> a = Dict(:a => 1, :b => 2) |
我們可以指定一個 aggregate function,如果遇到相同的鍵時,就把他們的值相加起來。
這個 aggregate function 可以是其他的,如此就可以處理多樣的資料。
mergewith
一樣有 in-place 版本 mergewith!
。
最神奇的是,mergewith
有類似 curry function 的行為。
1 | julia> mergewith(+)(a, c) |
你可以先給他一個 aggregate function,他會回傳一個匿名函式。
你可以拿這個匿名函式用在其他物件上。
目標是計算生物學家!Systems Biology, Computational Biology, Machine LearningJulia Taiwan 發起人
研發替代役研究助理