通俗解釋什麼函式程式設計中的函子Functors? - iRi

banq發表於2021-06-26

什麼是函子?
事實:如果您有Blob的來源,以及可以將Blob轉換為Thing的函式,則可以將它們放在一起以建立Things的來源。
例子:

  • 如果我有 A(一個整數列表)和 B(一個將整數轉換為字串的函式),我可以輕鬆建立 C(一個字串列表)。
  • 如果我有 A(一個整數到字串的雜湊表),和 B(一個將字串轉換為布林值的函式),我可以有 C(一個整數到布林值的雜湊表)。

那什麼是函子Functor 呢?函子Functor 是一個介面(或“特徵”、“概念”、“型別類”或任何您的語言喜歡的東西;從現在開始使用“介面”,因為我有意嘗試使用更常用的術語),它允許您將上述事實稱為一流的語言元素。在 Haskell 的案例中,Functor是透過提供fmap實現來實現的。對於上述示例,函式將:
  • 列表實現:獲取 B 中的函式並在我的所有元素上執行它並返回一個新列表,通常稱為map。
  • 雜湊表實現:取B中的函式對我所有的值執行它,返回一個具有相同鍵和新值的新雜湊表。
  • 函式實現:返回一個在A中執行函式的函式,然後在結果上執行B中的函式。這通常稱為函式組合。

最後一個有點棘手,但是如果您將其比喻中的函式視為在左側接受輸入並在右側提供輸出的黑匣子,那就是將第二個函式猛烈撞擊第一個函式的右側建立一個新的。這就是為什麼我說某物的“來源”;這裡的原則非常通用,並且超越了函式、容器和我擁有的所有其他方便的詞……它適用於您可能從中獲取值的任何事物
 

“函子”不是名詞
出於他們自己的充分理由,數學家使用“函子”作為具體名詞。Haskell 複製了這個,因此你經常聽到“一個函子”。
然而,介面是描述資料結構的形容詞,這就是為什麼在許多語言中它們通常以-able字尾(Iterable、Serializable 等)命名。程式設計師最好將其視為 Functable 或 Fmapable 或類似的東西。
 

“函子”並不總是容器
函子可以應用於許多不是容器的東西。我們已經在函式中看到了這一點。在非 Haskell 實現中,假設函子實現只能在容器上執行是一個常見的錯誤。

關於什麼是單子Monads點選標題見原文。
函子是我們可以隨意找到的自然事物。Monad 實現通常需要我們實際上經過深思熟慮來構建以適應抽象。

相關文章