2013-06-26 34 views
10

Nếu tôi có chức năng f :: State Int(), bạn có thể sử dụng nó trong một chức năng khác g :: StateT Int IO() không? Làm tổ nó với f = do { something; g } không thể đánh máy với Couldn't match type 'Data.Functor.Identity.Identity' with 'IO'.Kết hợp StateT IO với Tiểu bang

+0

Không nên có 'g = do {điều gì đó; f} '? Bạn muốn sử dụng f trong g, phải không? – gumik

Trả lời

18

Có, thao tác này thường được gọi là "cẩu". Chỉ cần xác định và sử dụng chức năng sau:

hoistState :: Monad m => State s a -> StateT s m a 
hoistState = StateT . (return .) . runState 

Thật không may, nó không được định nghĩa trong mô-đun Control.Monad.State.

+0

Tuyệt vời, cảm ơn! – Fraser

+3

Xem thêm [hướng dẫn cho gói 'mmorph'] (http://hackage.haskell.org/packages/archive/mmorph/1.0.0/doc/html/Control-Monad-Morph.html#g:4) –

+2

@GabrielGonzalez Có vẻ như có một loại lớp cho biến thế đơn nguyên với 'hoistId :: (Monad m) => t Nhận diện a -> tma' sẽ là một bổ sung hữu ích (Haskell98) cho các thư viện cơ sở. Nó chỉ là một phiên bản đặc biệt của 'MFunctor' cho hàm trả về của hàm functor. runIdentity'. –

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