2011-10-31 25 views
8

Trong ghci:ghci trường hợp đặc biệt cho ứng dụng?

λ> :t (pure 1) 
(pure 1) :: (Applicative f, Num a) => f a 
λ> show (pure 1) 

<interactive>:1:1: 
    No instance for (Show (f0 a0)) 
     arising from a use of `show' 
    Possible fix: add an instance declaration for (Show (f0 a0)) 
    In the expression: show (pure 1) 
    In an equation for `it': it = show (pure 1) 
λ> pure 1 
1 

Điều này nghĩa là rằng ghci thực hiện applicative và hiển thị kết quả, giống như IO?

Lưu ý rằng pure()pure (+1) không in bất kỳ thứ gì.

Trả lời

11

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).

+2

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

+0

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

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