2010-04-17 36 views
10

Tình trạng đơn nguyên "giao diện"Tiếp tục đơn nguyên "giao diện"

class MonadState s m where 
    get :: m s 
    put :: s -> m() 

(+ trở lại và ràng buộc) cho phép để xây dựng bất kỳ tính toán có thể với đơn nguyên nhà nước mà không sử dụng State constructor. Ví dụ, State $ \s -> (s+1, s-1) có thể được viết như

do s <- get 
    put (s-1) 
    return (s+1) 

Tương tự, tôi không bao giờ phải sử dụng Reader constructor, vì tôi có thể tạo ra mà tính toán sử dụng ask, return(>>=). Chính xác: Reader f == ask >>= return . f.

Đó có phải là cùng đúng đối với continuations - là nó có thể viết tất cả các trường hợp sử dụng Cont r acallCC (chức năng chỉ trong MonadCont), trở lại và ràng buộc, và không bao giờ gõ một cái gì đó giống như Cont (\c -> ...)?

Trả lời

7

Tôi không nghĩ vậy. Nhìn vào các loại:

Cont :: ((a -> r) -> r) -> Cont r a 
callCC :: ((a -> Cont r b) -> Cont r a) -> Cont r a 

Nếu bạn chỉ có callCC, không có sử dụng r như một loại bất cứ nơi nào - nó có thể là bất kỳ loại nào. Vì vậy, tôi không biết làm thế nào bạn có thể dịch một cái gì đó mà sử dụng nó như là một loại, ví dụ:

Cont (const 42) :: Cont Int a 

tôi không có cách nào kìm hãm r nếu tôi chỉ có callCC.

Dù sao, đó là linh cảm của tôi. Không quá khủng khiếp, nhưng có vẻ như thuyết phục.

+1

Tuy nhiên, tôi hy vọng điều này sẽ thay đổi nếu bạn đã tiếp tục phân tách ... –

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