Khi bạn gõ một biểu expr
vào GHCi, những điều sau đây xảy ra:
- Khái niệm là loại kiểm tra. Nếu có lỗi, GHCi sẽ cho bạn biết lỗi và từ bỏ.
- Nếu không, hãy nói
expr
được tìm thấy có loại t
; GHC cố gắng đối sánh t
với số IO a
.
- Nếu thành công, sau đó nó thực hiện một cái gì đó như
it <- expr
, sau đó nếu a
là một thể hiện của Show
và không phải là ()
, nó thực hiện print it
.
- Nếu nó không thành công, và
t
chính nó là một thể hiện của Show
, GHCi làm điều gì đó như let it = expr
và sau đó print it
.
- Nếu không, nó sẽ than phiền.
Về cơ bản, bạn cần một dấu nhắc của lệnh GHCi khi chạy các hành động IO và nhận các giá trị mà chúng quay lại và chơi với các giá trị thuần túy và nhìn thấy những gì bạn nhận được. Đó là lý do tại sao GHCi hành xử theo cách của nó: nếu nó có vẻ như bạn đang sử dụng một hành động IO, GHCi sẽ làm điều đó, và sau đó nếu hành động đó có kết quả có thể được hiển thị và thú vị (tức là không ()
) thì nó cho thấy kết quả cho bạn. Nếu nó không thể hiển thị kết quả cho bạn, thì đó không phải là vấn đề lớn, bởi vì bạn có thể chỉ muốn chạy tác vụ IO; nếu bạn muốn kết quả bạn đã đặt tên nó với <-
. Mặt khác, nếu có vẻ như biểu thức của bạn là không một hành động IO, GHCi sẽ tính toán nó và hiển thị nó cho bạn và nếu không thể hiển thị thì GHCi không thể làm gì hữu ích (không có tác dụng phụ nào thời gian), do đó, than phiền.
Trong trường hợp này, return "abc"
typechecks như IO String
, và String
là một thể hiện của Show
, vì vậy GHCi làm điều gì đó như
it <- return "abc"
print it
mà theo pháp luật đơn nguyên là chính xác giống như chỉ làm
print "abc"
do đó là kết quả.
Nguồn
2012-08-13 17:25:21
IO. Một phiên ghci giống như một IO Monad khổng lồ đặc biệt! – is7s