Nếu bộ nhớ bạn truy cập có thể thay đổi, thì đó thực sự là một tác dụng phụ.
Ví dụ, trong Haskell, hàm để truy cập một mảng có thể thay đổi ( IOArray
) có kiểu
Ix i => IOArray i e -> i -> IO e
(hơi đơn giản hóa cho mục đích của chúng tôi). Trong khi truy cập một mảng bất biến có loại
Ix i => Array i e -> i -> e
Phiên bản đầu tiên trả về một cái gì IO e
đó có nghĩa là nó có tác dụng phụ I / O. Phiên bản thứ hai chỉ đơn giản trả về một phần tử loại e
mà không có bất kỳ tác dụng phụ nào.
Trong trường hợp truy cập một tệp, bạn chỉ đơn giản là không thể biết tại thời điểm biên dịch liệu tệp có bao giờ thay đổi trong quá trình chạy chương trình hay không. Do đó, bạn phải luôn coi nó như một hoạt động với các tác dụng phụ tiềm ẩn.