۲۵ - ۷بازیابی تایپ معمولی از ترانسفورمر

اگه بخواین از یه ترانسفورمر، مثلِ معادلِ غیرِترانسفورمری‌ش استفاده کنین، یه ساختار ِ ‏‎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‎‏ آماده و دَمِ دست ِه؛ تایپ‌ش هم دقیقاً یکیه.