簡體   English   中英

F#MailboxProcessor和功能設計

[英]F# MailboxProcessor and Functional Design

如果狀態被認為是函數的壞主意,為什么當你使用MailboxProcessor時它被視為沒有狀態?

為了擴展,我向某人解釋函數式編程,函數如何不使用狀態(函數外沒有變量 - 即相同數據的相同數據)以及它帶來的好處。 但后來我開始考慮使用MailboxProcessor以及它使用遞歸來在函數調用之間保持狀態的方式,而且我不能完全調和為什么在這種情況下它是可以的。

這是持久狀態最不好的方式嗎?

邪惡真的是共享的可變狀態 在單線程情況下,共享可變狀態意味着函數無法安全組合 - 因為一個調用可以修改某個狀態,然后由第二個調用讀取,因此您將獲得意外結果。 在多線程情況下,共享可變狀態意味着您有可能出現競爭條件。

功能編程通常避免突變。 函數仍然可以共享一些狀態(例如,閉包可以捕獲一個狀態),但它不能被變異。 在單線程情況下,也沒有非確定性。 在多線程的情況下,在純函數風格中你唯一可以做的就是做fork-join並行(和數據並行),它不需要可變狀態並且是完全確定的。

基於代理的編程也避免了共享的可變狀態,但是以不同的方式。 您有隔離的代理只能共享不可變的消息。 因此存在一些非確定性(因為它們通過發送消息進行通信),但它們只交換不可變的值。 實際上,您甚至可以在代理中使用可變狀態 - 只要它不共享,您仍然可以避免共享可變狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM