Vâng, nếu thay vì IO, bạn đã sử dụng một đơn nguyên mô phỏng I/O với môi trường được kiểm soát và được điều chỉnh hoàn hảo? Bạn có thể dễ dàng kiểm tra những hành động "IO" như chúng là các hàm thuần túy. Đây là ý tưởng đằng sau ví dụ IOSpec, mà thậm chí còn đi xa hơn bằng cách cho phép bạn xác định một cách chính xác những gì loại có hiệu lực bạn muốn cho phép trong mô phỏng IO của bạn, bạn có thể viết:
myFunction :: a -> b -> IOSpec (Teletype :+: IORefS)
myFunction x y = do
...
putStr (...)
ref <- newIORef ...
...
(teletype phép cho các chức năng thiết bị đầu cuối, IOREFS để tham khảo) Và sau đó kiểm tra hàm của bạn trong một thuộc tính quickcheck (ví dụ xem mô-đun VM và runIOSpec) với toàn quyền kiểm soát đầu vào và đầu ra hoặc thậm chí từng bước trong GHCI. Và nếu nó hoạt động chính xác, chỉ cần thay đổi nhập để giới thiệu Test.IOSpec.Surrogate xác định lại IOSpec f làm từ đồng nghĩa cho IO.