2015-05-26 14 views
8

Tôi đã cố gán giá trị được nâng lên a.Trong GHCi, tại sao tôi không thể hiển thị `pure 1` trong REPL?

λ> :m Control.Applicative 
λ> let a = pure 1 

Khi tôi đánh giá a trong REPL, nó in 1.

λ> a 
1 

Vì vậy, tôi nghĩ rằng có thể có một thực hiện show cho a, và cố gắng này:

λ> show a 

Nhưng GHCi ném một lỗi:

<interactive>:70:1-4: 
    No instance for (Show (f0 a0)) arising from a use of ‘show’ 
    The type variables ‘f0’, ‘a0’ are ambiguous 
    Note: there are several potential instances: 
     instance (Integral a, Show a) => Show (GHC.Real.Ratio a) 
     -- Defined in ‘GHC.Real’ 
     instance (Show a, Show b) => Show (a, b) -- Defined in ‘GHC.Show’ 
     instance (Show a, Show b, Show c) => Show (a, b, c) 
     -- Defined in ‘GHC.Show’ 
     ...plus 32 others 
    In the expression: show a 
    In an equation for ‘it’: it = show a 

Có ai có bất kỳ ý tưởng về điều này?

+0

Bạn đã thử kiểm tra ': nhập a' chưa? Điều đó sẽ cho bạn biết điều gì đó, có thể. – AJFarmar

+1

@AJFarmar Thực ra, không nhiều lắm, vì GHCi không mặc định 'm' thành' IO'. – chi

+2

Một chút của giải thích meta là theo thứ tự. Mặc dù bạn có thể nghĩ GHCi là một "thông dịch viên Haskell", nhưng nó thực sự là một loại quái vật khá khác. Đó là một công cụ để phát triển các chương trình Haskell tương tác. Trong khi Haskell lo lắng rất nhiều về việc giữ mọi thứ tốt đẹp và nhất quán, GHCi quan tâm chủ yếu về tiện lợi và tiện ích. – dfeuer

Trả lời

19

GHCi đang đặt mặc định Applicative f => f thành IO. Khi bạn làm

λ> a 
1 

bạn thực sự chạy một IO Integer hành động như

λ> let a = return 1 
λ> a 
1 

GHCi bởi bản in mặc định là kết quả của hành động IO. Do đó, 1 trong dòng kết quả. (Khá gây nhầm lẫn, 1 đây không phải là giá trị của a, cũng không phải kết quả của chạy a như một hành động IO -. Chỉ là giá trị trả về của cái sau)

GHCi sử dụng một công nghệ tự động tinh vi để xử lý đầu vào người dùng. Đầu tiên, nó cố gắng để show nó, có thể mặc định một số loại lớp học như số. Điều này không thành công trong trường hợp của bạn. Khi thất bại, nó sẽ cố gắng để xem đầu vào là một hành động IO. Trong trường hợp như vậy, hành động được chạy và, nếu kết quả có thể là show ed, nó được in.

Lưu ý rằng phép thuật GHCi này chỉ xảy ra ở cấp cao nhất. Khi bạn cố gắng show a, GHCi thử phép thuật của nó trên toàn bộ show a, không phải trên a, do đó tác động tương tự cũng không xảy ra.

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