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