Bạn nhận được cùng một hành vi nếu bạn sử dụng return
thay vì pure
. Để tìm hiểu việc cần làm, ghci phải chọn loại cho biểu thức đã cho. quy tắc mặc định của ghci là như vậy mà các ràng buộc khác vắng mặt, nó chọn IO
cho một ví dụ Applicative
hoặc Monad
. Vì vậy, nó diễn giải pure 1
như một biểu thức của loại IO Integer
. Biểu thức loại IO a
được nhập tại dấu nhắc được thực hiện và kết quả của chúng được in, nếu 1. a
có một ví dụ Show
và 2. a
không phải là ()
. Vì vậy vào pure 1
vào kết quả nhanh chóng trong
v <- return (1 :: Integer)
print v
return v
được thực thi (và sự kỳ diệu biến it
ràng buộc với trở v
). Đối với pure()
, trường hợp đặc biệt được áp dụng vì ()
được coi là không quan tâm, do đó chỉ return()
được thực hiện và it
được ràng buộc là ()
, cho pure (+1)
, một hàm được trả về, không có trường hợp Show
cho các chức năng trong phạm vi. Tuy nhiên,
Prelude Control.Applicative> :m +Text.Show.Functions
Prelude Control.Applicative Text.Show.Functions> pure (+1)
<function>
it :: Integer -> Integer
Prelude Control.Applicative Text.Show.Functions> it 3
4
it :: Integer
với một trường hợp Show
cho các chức năng trong phạm vi, nó được in (không phải là nó cung cấp thông tin), và các chức năng sau đó có thể được sử dụng (sau này là độc lập với một trường hợp Show
là trong phạm vi, tất nhiên).
Nguồn
2011-10-31 03:05:11
Tôi vừa mới nhận ra rằng 'instance IOative áp dụng'. Vì vậy, nó cũng cho phép 'pure 1 >> = \ it -> in nó' để làm việc. Tôi vừa mới học về mô-đun 'Text.Show.Functions'. Tôi đã luôn luôn tự hỏi tại sao chức năng không thể hiển thị theo mặc định. – gawi
Dưới đây là một ví dụ khác về cách sử dụng Applicative, Functor và IO: 'pure (+1) <*> fmap (đọc :: String -> Int) getLine' – nponeccop