如何避免在F#中改变状态?

时间:2016-01-05 11:19:03

标签: f#

我有一个使用C# WebAPI库的F#应用程序。

F#库的值为:

 let mutable CurrentCustomer:Customer option = None

我也有:

 let Customers:Map<string,Customer> option = None

CustomersCustomer都是&#34;全局变量&#34;。启动时,C#应用程序会将一组客户加载到此全局变量Customers中。然后我有一个customersController,其Post调用F#函数setCurrentCustomer,从CurrentCustomer中存储的集合中设置全局变量Customers: / p>

 // Post in customersController:

 public HttpResponseMessage Post(string identifier)
 {
     var _customer = FSharpLibrary.setCurrentCustomer(identifier);
     // code
 }

 // setCurrentCustomer function:

 let mutable CurrentCustomer:Customer option = None
 let setCurrentCustomer() =
     CurrentCustomer <- customer |> Some
     CurrentCustomer

有没有办法通过更改CurrentCustomer

来避免更改状态

我知道我可以创建一个带有CurrentCustomer对象的函数并返回一个新的CurrentCustomer对象,但customersController将如何知道当前客户设置为什么?

有没有办法避免使用这个全局可变变量Customer

1 个答案:

答案 0 :(得分:4)

  

有没有办法通过更改CurrentCustomer来避免更改状态?

是的,有很多方法可以做到这一点,但大多数方法都涉及更改FSharpLibrary的设计,以便它不依赖于可变状态。

作为一个完全一般的答案,您可以应用 State Monad ,但较少涉及的内容通常就足够了。但是,如果不知道你想要完成什么,那么这就不可能回答。

  

customersController将如何知道当前客户的设置是什么?

它已经知道,因为它将当前客户设置为identifier方法的Post参数。该值在整个方法的范围内。

问题是为什么你的FSharpLibrary有可变状态?你不能用纯函数实现它吗?