2010-04-04 25 views
12

Tôi đang đọc chương Monads trong thế giới thực Haskell (chương 14). Một chức năng là defined như sau:Lý do cho MonadState có được và đặt?

type RandomState a = State StdGen a 
getRandom :: Random a => RandomState a 
getRandom = 
    get >>= \gen -> 
    let (val, gen')= random gen in 
    put gen' >> 
    return val 

Tôi thực sự không hiểu mục đích của get và đặt chức năng ở đây. Tôi viết lại các chức năng như sau mà dường như làm điều tương tự và ngắn gọn hơn:

getRandom2 :: Random a => RandomState a 
getRandom2= State $ \ s -> random s 

Vì vậy, câu hỏi của tôi là: mục đích được và đặt nói chung là gì?

+1

Chỉ trong trường hợp này, hoặc mục đích của 'get' và 'put' nói chung? Việc sử dụng chúng có thể được giải thích dễ dàng hơn trong trường hợp sau… – kennytm

+0

Nói chung; Tôi sẽ chỉnh sửa câu hỏi của mình. – CiscoIPPhone

Trả lời

12

Đó là một chút của một trùng hợp ngẫu nhiên mà random xảy ra để có chính xác cùng loại mẫu chữ ký/sử dụng như chức năng bên trong của State đơn nguyên (và thực sự trong trường hợp này bạn có thể còn hơn súc tích, nếu có lẽ khó hiểu hơn, với getRandom2 = State random).

Tuy nhiên, thông thường sẽ không áp dụng, và sau đó getput là các đoạn ống dẫn thuận tiện có ý nghĩa rõ ràng hơn là viết trực tiếp chức năng bên trong. Chúng cũng giúp trừu tượng hóa từ biểu diễn chính xác được sử dụng bởi State - chúng thực sự là thành viên lớp của lớp tổng quát hơn MonadState, vì vậy bạn có thể viết mã đa hình hơn bằng cách sử dụng chúng.

+0

Tôi có thêm một câu hỏi - cách đặt * giữ * trạng thái mới cho cuộc gọi tiếp theo? Đầu ra của * put * bị bỏ qua, tôi không thể hiểu được. Hãy giúp tôi ra. Cám ơn. –

+0

Đó là một phần của hệ thống ống nước bên trong của đơn vị 'State'. Đầu ra đơn điệu của 'put' là kiểu'() 'để chỉ ra rằng nó không phải là một giá trị hữu ích. –

+0

Thx để trả lời. Nhưng tôi hoàn toàn không hiểu. Nó có nghĩa là * đặt * có một số tác dụng phụ? Bạn có thể giải thích cách nó lưu trữ trạng thái mới không? Cám ơn. –

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