۲۵ - ۷بازیابی تایپ معمولی از ترانسفورمر
اگه بخواین از یه ترانسفورمر، مثلِ معادلِ غیرِترانسفورمریش استفاده کنین، یه ساختار ِ m ای لازم دارین که هیچ کاری انجام نمیده. قبلاً چنین چیزی ندیدیم؟ Identity چطوره؟
λ> runMaybeT $ (+1) <$> MaybeT (Identity (Just 1))
Identityt {runIdentity = Just 2}
λ> runMaybeT $ (+1) <$> MaybeT (Identity Nothing)
Identity {runIdentity = Nothing}با توجه به اونها، میشه اینطوری از IdentityT به Identity رسید (و همچنین بقیهی تایپها):
type MyIdentity a = IdentityT Identity a
type Maybe a = MaybeT Identity a
type Either e a = EitherT e Identity a
type Reader r a = ReaderT e Identity a
type State s a = StateT s Identity aتایپِ Identity نقشِ یه چسبِ ساختاری ِ هیچکاره رو بازی میکنه و درزِ بینِ یه ترانسفورمر و تایپِ معمولیش رو پر میکنه.
قبوله، ولی چرا لازمه؟
به طورِ معمول، اگه با ترانسفورمری کار میکنین که تایپِ معادلِ غیرترانسفورمری داره، چنین کاری لازم نیست. برای مثال، کم پیش میاد که ExceptT Identity لازم بشه، چون تایپِ Either از پیش تعریف شده و نیازی نیست از ترانسفورمرِش بازیابی بشه. ولی اگه بر فرض با چیزی مثلِ scotty کار میکنین که ReaderT جزئی از محیطِش ِه، به سادگی نمیشه تایپِ Reader رو بازیابی کرد، چون تایپِ Reader به خودیِخودش وجود نداره و بدونِ بازنویسیِ کلِ scotty (خدا به داد برسه) نمیشه ReaderTش رو تغییر داد. با این شرایط ممکنه موقعیتی پیش بیاد که فقط Reader لازم باشه، نه ReaderT. چنین موقعی با استفاده از ReaderT Identity که با scotty هم سازگاره، بدون بازنویسیِ کلِ کتابخونه، میتونین کُدتون رو یه ذره سادهتر و جمعوجورتر بنویسین.
کتابخونه ِ transformers
کلاً بدونِ دلیلِ خوب و مشخص از این نسخههای دست-پیچِ تایپهای ترانسفورمری استفاده نکنین. خیلی از اونها آماده تو base یا کتابخونه ِ transformers (که باید با GHC نصب شده باشه) وجود دارن.
یه نکته دربارهی ExceptT
با اینکه یه کتابخونه به اسمِ either روی Hackage هست که تایپِ EitherT هم داره، اکثر هسکلنویسها دارن میرن سمتِ تایپِ ExceptT از کتابخونه ِ transformers (که کاملاً یکسانه). بیشتر به خاطر اینه که transformers با GHC نصب میشه، پس ExceptT آماده و دَمِ دست ِه؛ تایپش هم دقیقاً یکیه.