2012-04-24 32 views
24

Tôi nhận thấy rằng Data.UnionFind sử dụng đơn nguyên IO để cung cấp con trỏ qua IORef. Tôi tưởng tượng mọi người vui vẻ gọi unsafePerformIO khi sử dụng nó cục bộ trong mã thuần, vì cấu trúc dữ liệu được hiểu rất rõ, nhưng ..Tránh IORef trong mã thuần túy

Có cách tiếp cận sạch hơn về mặt cấu trúc dữ liệu như vậy không? Có lẽ một wrapper xung quanh IO mà làm cho không thể tránh khỏi unsafePerformIO ít không an toàn "tìm kiếm" bằng cách cấm hầu hết các hoạt động IO?

+0

Tôi tin rằng gói được dự định sẽ được sử dụng bên trong đơn nguyên IO. Hầu hết các Haskellers ở cách xa 'unsafePerformIO' càng tốt. –

Trả lời

30

Có cách tiếp cận sạch hơn về mặt kinh điển cho cấu trúc dữ liệu như vậy không? Có lẽ một wrapper xung quanh IO mà làm cho không thể tránh khỏi không an toànPerformIO ít không an toàn "tìm kiếm" bằng cách cấm hầu hết các hoạt động IO?

Có, chính xác. Bạn vừa phát minh ra the ST monad, được giới thiệu bởi Launchbury and Peyton Jones khoảng 20 năm trước.

Đơn vị ST chỉ cho phép các hiệu ứng bộ nhớ có phạm vi cục bộ. Điều đáng chú ý ở chỗ nó sử dụng hệ thống kiểu để đảm bảo rằng các hiệu ứng phụ không thể nhìn thấy bên ngoài phạm vi của khối mã đang sử dụng chúng. Vì vậy, miễn là bạn chỉ sử dụng bộ nhớ thông qua tài liệu tham khảo, chỉ trong phạm vi địa phương, bạn có thể tránh unsafePerformIO và sử dụng ST thuần túy thay thế, ví dụ: implement union-find.

+0

Ahh, tôi đã không nhận ra ST có những tham khảo nội bộ, cảm ơn. –

+0

Liên kết '' 'ST monad''' ở trên bị hỏng. Đây là phiên bản hiện tại: http://hackage.haskell.org/package/base-4.9.1.0/docs/Control-Monad-ST.html –

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