2011-08-11 34 views
9

Có thể tương tác với các cá thể Monad tùy ý tăng dần tại dấu nhắc GHCi không?Monads tại dấu nhắc?

Bạn có thể nhập "làm" lệnh tương tác:

Prelude> x <- return 5 

Nhưng như xa như tôi có thể nói, tất cả mọi thứ được buộc vào IO() Monad. Nếu tôi muốn tương tác với một Monad tùy ý thay thế thì sao?

Tôi có bị buộc phải viết toàn bộ chuỗi lệnh bên trong một số khổng lồ do { ... } và/hoặc sử dụng các toán tử infix trực tiếp không? Đó là okay, nhưng tôi rất muốn "nhập" một đơn nguyên tùy ý và tương tác với nó một dòng tại một thời điểm.

Có thể?

+1

Xem ghc trac ticket http://hackage.haskell.org/trac/ghc/ticket/4316 – vivian

Trả lời

4

Chắc chắn bạn có thể. Chỉ cần chú thích loại của bạn.
ví dụ: cho Maybe Monad:

let x = return 5 :: Maybe Int 

sẽ dẫn đến

Just 5 

Hoặc lấy danh sách đơn nguyên:

let x = return 5 :: [Int] 

sẽ dẫn đến

[5] 

Tất nhiên bạn cũng có thể chơi xung quanh bên trong đơn nguyên:

let x = return 5 :: Maybe Int 
x >>= return . (succ . succ) 

mà sẽ dẫn đến Just 7

+2

Tôi không nghĩ đó là điều OP đang yêu cầu; theo cách tôi đọc nó, anh ta muốn loại phiên tương tác là Monad m => m a chứ không phải là IO a, không chỉ là 'làm công cụ' với monads. – valderman

+0

@ valdermann: bạn đúng ... tuy nhiên tôi thấy điều này rất hữu ích rất nhiều lần và trong một phiên hoạt động ghci đây là cách duy nhất (theo kiến ​​thức của tôi) để "tương tác với một đơn nguyên tùy ý" – oliver

+1

@oliver Không, nó không hoàn toàn là những gì tôi đang tìm kiếm, nhưng vì những gì tôi đang tìm kiếm là không thể, tôi đoán đây là câu trả lời. Gõ {it >> =} như là một tiền tố trên mỗi dòng cung cấp cho một số cảm giác gia tăng tôi muốn, với chi phí của một vài tổ hợp phím. Cảm ơn! – tangentstorm

11

Như điều đứng, hành vi cụ thể IO dựa trên đường IO hành động là một statelike bit và unretractable. Vì vậy, bạn có thể nói những thứ như

s <- readFile "foo.txt" 

và nhận giá trị thực tế s :: String.

Khá rõ ràng rằng phải mất nhiều hơn chỉ cấu trúc Monad để duy trì loại tương tác đó. Nó sẽ không được dễ dàng như vậy với

n <- [1, 2, 3] 

phải nói gì giá trị n có.

Người ta có thể tưởng tượng thích ứng với ghci để mở lời nhắc cho phép tính toán đơn điệu được xây dựng theo nhiều tương tác dòng lệnh, cung cấp toàn bộ tính toán khi dấu nhắc đóng. Không rõ ý nghĩa của việc kiểm tra các giá trị trung gian (ngoài việc tạo các bộ sưu tập các tính toán in của loại m (IO()), đối với đơn nguyên hoạt động là m, tất nhiên). Tuy nhiên, sẽ rất thú vị nếu bạn hỏi liệu điều gì đặc biệt về IO có thể làm cho một hành vi nhắc nhở tương tác tốt đẹp có thể bị cô lập và tổng quát hay không. Tôi không thể không đánh hơi một câu chuyện về ngữ cảnh giá trị trong ngữ cảnh về sự tương tác tại một dấu nhắc, nhưng tôi chưa theo dõi nó.Người ta có thể tưởng tượng giải quyết ví dụ danh sách của tôi bằng cách xem xét con trỏ thành không gian có thể có giá trị, cách IO có con trỏ được áp đặt trên đó vào thời điểm hiện tại của thế giới thực. Cảm ơn vì thức ăn đã suy nghĩ.

+0

Tôi thấy quan điểm của bạn. Chúng hơi quá chung chung. Tôi đã đặc biệt muốn sử dụng nó cho một đơn vị nhà nước, mặc dù khái niệm con trỏ của bạn là khá hấp dẫn quá. – tangentstorm

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