2017-08-08 15 views
11

"return một" là nghĩa vụ phải quấn một trong bối cảnh của một số đơn nguyên:Tại sao "trả lại Không có gì" trả lại Không có gì?

*Main> :i return 
class Applicative m => Monad (m :: * -> *) where 
    ... 
    return :: a -> m a 
    ... 
     -- Defined in ‘GHC.Base’ 

Nếu tôi hỏi GHCI gì loại "return Không có gì" được, nó phù hợp với rằng:

*Main> :t return Nothing 
return Nothing :: Monad m => m (Maybe a) 

Nhưng nếu tôi đánh giá nó, tôi thấy không có bên ngoài Monad, chỉ là bên trong có thể:

*Main> return Nothing 
Nothing 
+11

GHCi mặc định là đơn nguyên IO nếu bạn không xác định một. Nó chỉ in nội dung của một 'IO (Có thể a)' – 4castle

+7

@ 4castle Để hơi misquote shachaf: Một 'IO (Có thể a)' chứa một 'Có thể a' trong cùng một cách mà'/bin/ls' chứa một danh sách tệp. Điều này nghe có vẻ hơi phức tạp, nhưng nó không in nội dung của 'IO (Có thể a)'. Nó đang chạy một 'IO (Có thể a)' và sau đó in kết quả của điều đó. Sự khác biệt có thể là quan trọng. –

+1

@DavidYoung Tôi không cá nhân tìm thấy sự khác biệt là quan trọng, bởi vì đó là công việc của IO monad để biết biểu diễn bên trong của giá trị. Vì mục đích lý luận, tôi thường nghĩ về tất cả các monads là container (cho dù chúng có chứa giá trị hay không). – 4castle

Trả lời

21

Khi GHCi đi để in một giá trị, nó cố gắng hai điều khác nhau. Trước tiên, nó cố gắng hợp nhất loại với IO a cho một số a. Nếu nó có thể làm điều đó thì nó thực thi hành động IO và cố gắng in kết quả. Nếu nó không thể làm điều đó, nó sẽ cố gắng in giá trị đã cho. Trong trường hợp của bạn, Monad m => m (Maybe a) có thể được hợp nhất với IO (Maybe a).

Rà soát phiên GHCi này có thể giúp:

Prelude> return Nothing 
Nothing 
Prelude> return Nothing :: IO (Maybe a) 
Nothing 
Prelude> return Nothing :: Maybe (Maybe a) 
Just Nothing 
Prelude> Nothing 
Nothing 
Các vấn đề liên quan