2013-09-03 26 views
5

Tôi hiện đang có code mà trông như thế này:Đang tìm kiếm các thiếu nước Combinator cho Lens

do 
    x <- use foo 
    foo <~ runFoo x 

nơi foo là một Lens đến một lĩnh vực FoorunFoo :: MonadState m => Foo -> m Foo

Tôi nghĩ cần phải có một cách để làm hoạt động này trong một dòng, nhưng tôi không thể tìm thấy nó. Tôi nghĩ rằng nó nên có một lời nhận xét như:

(????) :: MonadState s m => Lens' s a -> (a -> m a) -> m a 

Câu hỏi:

  • Có một combinator như vậy tồn tại? Nếu vậy, nó là cái gì?
  • Khi tôi chạy vào một câu hỏi như thế này, cách tốt nhất để tìm kiếm câu hỏi đó (nghĩa là tôi thường chỉ nhập tên này vào Hoogle nhưng tôi không may mắn làm điều đó với thư viện ống kính)
  • đây thực sự là một combinator nguyên thủy được tìm thấy trong Control.Monad? (Tôi sẽ hơi xấu hổ nếu đây là một công việc khác cho mũi tên kleisli)

Trả lời

0

Chữ ký loại hàm bạn đang tìm kiếm gần đúng là >>=, nhưng với đối số đầu tiên khác nhau.

Cụ thể, có vẻ như use foo :: Monad m => m Foofoo <~ runFoo :: Foo -> m Foo, vì vậy bạn có thể sử dụng liên kết trực tiếp dưới dạng use foo >>= (\x -> foo <~ runFoo x). Có lẽ một cách dễ dàng hơn/ngắn hơn, nhưng tôi không có mã đầy đủ để chơi cùng. Tôi muốn nói chỉ cần dính vào bằng cách sử dụng hai dòng, và nếu nó là một hoạt động đủ phổ biến, sau đó xác định tổ hợp của riêng bạn cho nó.

+1

Bạn đã thực sự làm bất cứ điều gì nữa ở đó thì chỉ desugar Haskell 'do' ký hiệu? Kỹ thuật này có thể được sử dụng để kết hợp hai dòng trong câu lệnh 'do'. Tôi muốn hợp nhất 'use' và' (<~) '. –

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