我正在寫我的第一個 monad 實體,所以如果我遺漏了一些明顯的東西,請原諒。
我想做這樣的事情:
readStuffFromDatabase >>= function1 >>= ... >>= functionN >>= writeStuffToDatabase
function1 ... functionN 是業務邏輯。任何業務邏輯都可以回傳 DoNothing,這顯然會阻止任何進一步的計算。
以下是我的問題:
我是否以正確的方式思考問題?這種方法能否帶來慣用的代碼、良好的性能等,還是已經注定要失敗?
我應該如何定義一種旨在將任意數量的計算鏈接在一起的型別?對我來說模糊的是所有 monad 實體都已經這樣做了,而我只需要一個 vanilla monad 實體嗎?(比如Maybe?)還是我需要更復雜的東西?
uj5u.com熱心網友回復:
短版:Monad幾乎肯定會把你逼到角落里。Applicative相反,您需要或最多需要一個選擇性應用程式。
假設你選擇一個 monad,給它命名M,并有一些類似的動作numEmployees :: M Int。現在我寫:
do
n <- numEmployees
if n > 10
then computeTaxes
else dollars 1000 <$ DoNothing
要執行此操作,您需要在知道之前決定是否執行else分支n。不可能。
monad 的基本特征是,在決定做什么之前,后面的操作可以檢查早期操作回傳的值。應用函子不支持這一點,因此更適合您希望進行的那種靜態分析。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/437096.html
