7

Tôi đang học Haskell và Yampa vào lúc này và có một câu hỏi về chức năng phản ứng.Sự khác biệt về thời gian trong hàm phản ứng (ý nghĩa) trong Yampa

reactimate :: IO a -- init 
     -> (Bool -> IO (DTime, Maybe a)) -- sense 
     -> (Bool -> b -> IO Bool) -- actuate 
      -> SF a b -- signal function 
     -> IO() 

Như bạn có thể thấy trong chữ ký loại, một phần đầu ra cho hàm ý nghĩa là chênh lệch thời gian giữa lệnh gọi hiện tại và cuộc gọi trước đó của hàm. Trong các ví dụ tôi đã thấy, sự khác biệt về thời gian này là "thủ công" được tính toán bên trong ý nghĩa, sử dụng IORef để giữ giá trị của cuộc gọi trước đó.

Có vẻ lạ khi bạn phải theo dõi chênh lệch thời gian bằng cách sử dụng trạng thái bên ngoài, tại sao tính toán này không được thực hiện trong hàm phản ứng? IORef là một cách hay để xử lý?

Trả lời

1

Tôi sẽ nghĩ lý do phản ứng không tính toán chính thời gian delta là điều này sẽ khó mã hóa một khái niệm cụ thể về thời gian. Hãy tưởng tượng bạn muốn mô phỏng rủi ro danh mục đầu tư trong khoảng thời gian mười năm hoặc một cái gì đó như thế này, và độ phân giải đồng bằng thời gian của bạn nên là một ngày. Điều này đang được nói, tôi đồng ý điều Ioref có vẻ như hacky, mặc dù tôi đã sử dụng kỹ thuật tương tự trong mã của tôi.

Các vấn đề liên quan