首頁 > 後端開發 > Python教學 > 單子是內函子類別中的廬半群...

單子是內函子類別中的廬半群...

Barbara Streisand
發布: 2025-01-04 07:32:43
原創
719 人瀏覽過

A monad is a monoid in the category of endofunctors...

什麼是 Monad?

單子是 么半群,屬於 endofunctors... ?

...讓我們再試一次:

單子是函數式程式設計中使用的一種抽象,用於以一致的方式處理計算。它是一種設計模式,允許操作鏈接,同時以受控方式封裝副作用,例如狀態變更、I/O 或錯誤。

Monad 可以被認為是一種包裝值並將函數應用於它們的方式,確保計算在可預測和受控的環境中進行。

我個人的理解是:monad是一種資料結構,具有

  • 單一、不可變的值(或函數)
  • 映射/綁定函數,將函數對應到該值
  • 一個返回/展平函數,每次將新狀態返回到一個新的 monad

這使得能夠以保留不變性和函數純度的方式連結和組合操作——這是類別的「反向」方法,其中狀態無法就地修改,但可以在功能上應用轉換來產生新實例。

這種「反向對稱」突顯了對比:

  • 類別修改其內部狀態,透過內部方法保持可變性和直接互動。他們大部分時間都與全球國家互動

  • Monad 達到類似類似的結果,但透過包裝值和映射外部不可變轉換,它們沒有副作用:沒有全局狀態

範例:

  • 班級: Box 類別保存一個值,您可以透過呼叫 setValue(newValue) 等方法來修改該值,這會改變 Box 的內部狀態。
  • 莫納德: BoxMonad 將以不可變的方式儲存一個值。要轉換值,您可以使用像 map 這樣的函數,它將外部函數應用於該值並傳回一個帶有新值的新 BoxMonad。

Python 範例專案:
https://github.com/blackopsrepl/py-monad-task-manager

在這個應用程式中,我們使用 State Monad 來管理任務清單的狀態。 State Monad 提供了一種將任務管理流程建模為應用程式狀態的一系列轉換的方法,同時保持狀態本身不可變。

我們沒有直接修改任務清單的狀態,而是使用 return_ 函數將初始狀態包裝到一個單子容器中,並使用綁定函數以可預測的方式將轉換應用於狀態。每次執行操作(例如新增、編輯或刪除任務)時,它都會傳回一個新的狀態實例,確保不變性和可組合性。

主要功能:

  • return_:將值包裝到 Monadic 容器中,使其成為 Monadic 計算鏈的一部分。
  • bind:將函數應用於 monad 內的值,傳回一個帶有轉換後的值的新 Monadic 容器。

透過使用 State Monad,我們可以以確保狀態不可變地更新並且組合計算的方式處理任務管理操作,而不會產生副作用或操作之間不需要的交互。

以上是單子是內函子類別中的廬半群...的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板