Tôi hiện đang thiết kế một thuật toán số như là một phần của hoạt động yêu cầu cập nhật vectơ doubles
nhiều lần. Do thực tế là thuật toán phải là không gian và thời gian hiệu quả nhất có thể, tôi không muốn mã kiểu mã FP truyền thống tạo ra nhiều phiên bản cấu trúc dữ liệu dưới mui xe sau mỗi thao tác trên nó. Tôi cũng không muốn tạo cấu trúc dữ liệu có thể thay đổi được và có sẵn trên toàn cầu. Do đó, tôi đã quyết định sử dụng cấu trúc dữ liệu có thể thay đổi nhưng sau đó chọn thực hiện các hoạt động có thể thay đổi trong đơn vị State
. Do đây là đâm đầu tiên của tôi tại sử dụng một đơn nguyên State
, tôi muốn khẳng định cho dù tôi có hay không cóĐộ tinh khiết, tính minh bạch tham chiếu và đơn vị trạng thái
- bảo quản minh bạch tham chiếu
- duy trì độ tinh khiết chức năng
Chức năng update
chuyển tiếp dữ liệu trạng thái cấu trúc. Vì bản cập nhật phá hoại được bản địa hóa trong hàm này và việc xử lý cấu trúc dữ liệu không thể có được từ bên ngoài, tôi nghĩ rằng hàm này là thuần khiết và tham chiếu trong suốt.
def update(i : Int,d : Double) = State[ArraySeq[Double], Unit]{
case xs: ArraySeq[Double] => {xs(i) = d; (xs,())}
}
Chức năng app
là một hàm đồ chơi đó sẽ tiêu thụ một chuỗi các double
s và sửa đổi nó là trạng thái:
def app : State[ArraySeq[Double], Unit] = for{
_ <- update(0, 3.142)
// do a heap of stuff on ArraySeq
}yield()
Gọi:
app(Vector(0.0, 1.0, 2.0, 3.0, 4.0).to[ArraySeq])._1.to[Vector]
Kết quả:
res0: Vector[Double] = Vector(3.142, 1.0, 2.0, 3.0, 4.0)
Bạn có đang sử dụng trạng thái của scalaz hoặc bạn đã tự viết cho mình không? – Daenyth