2012-02-03 28 views
11

Trong khi xem qua gói máy biến áp, tôi tìm thấy biến áp đơn nguyên này được gọi là IdentityT.Mục đích của biến áp IdentityT là gì?

Mặc dù tôi hiểu cách sử dụng đơn sắc danh tính (ví dụ: State chỉ là bí danh cho StateT Identity) và cách biến thế đơn nguyên nói chung, tôi không biết làm thế nào có liên quan đến IdentityT.

Vì nó không có trong MTL, tôi đoán nó đã được thêm vào trong đó chỉ để hoàn thành và không sử dụng thực tế. Đúng không?

Trả lời

6

Vâng các tài liệu liên quan không nói

này rất hữu ích cho các chức năng tham số hóa bởi một biến đơn nguyên.

Mặc dù tôi không biết bất kỳ tình huống nào thực sự xảy ra. Về mặt lý thuyết, nếu bạn có chức năng như foo :: (MonadTrans t, Monad m) => t m a -> b đối với một số hữu ích b, thì bạn có thể muốn "câm" xuống về cơ bản m a -> b bằng cách sử dụng t = IdentityT.

Nhưng IdentityTMonadTrans những gì IdentityMonad. Đây là biến "pass-through", như là Identity là đơn vị "pass-through". Chỉ cần kiểm tra nguồn; nó khá đơn giản. IdentityT SomeMonad a sẽ hoạt động giống hệt với SomeMonad a, khác biệt duy nhất là sự hiện diện của một kiểu mới phụ (dĩ nhiên, được loại bỏ tại thời điểm biên dịch)

2

Có một sử dụng đề xuất ở đây (có lẽ là nguồn gốc của IdentityT: http://www.haskell.org/pipermail/libraries/2007-June/007563.html

Việc sử dụng chính có vẻ là để cho phép sự linh hoạt ở cấp mã nguồn, ví dụ như ai đó có thể chỉnh sửa mã nguồn để xmonad và thay UserT của mình Tôi đã cố gắng để xem làm thế nào mà có thể làm việc cho một thư viện - bạn có thể sử dụng nó để cung cấp một trình giữ chỗ cho chèn một đơn nguyên ở giữa một ngăn xếp, tôi không chắc chắn về một trường hợp tuyệt vời, tôi có thể sử dụng nó. Đây là ví dụ giả tạo của tôi:

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 

module Main where 

import Control.Monad.State 
import Control.Monad.List 
import Control.Monad.Reader 

type X m a = StateT Int (m IO) a 

something :: (Monad (m IO), MonadIO (m IO)) => (m IO) Int -> X m Int 
something a = do 
     x <- lift a 
     put (x + 1) 

     liftIO $ print x 
     return x 



listSomething = something $ ListT (mapM return [1,2,3,4]) 
plainSomething = return 5 :: IdentityT IO Int 

main = do 
    x <- runListT (execStateT listSomething 3) 
    print x 

    y <- runIdentityT (execStateT plainSomething 3) 
    print y 

runIdentity $ mapM (return . (+1)) [1..100] 
Các vấn đề liên quan