سؤال

لدي وظيفة f مع التوقيع f :: [a] -> StateT Int Reader b [c], ، و f' مع التوقيع f' :: a -> StateT Int Reader b [c]

يبدو أن الحساب في F (مبسط للغاية) يلي:

f [] = return []
f (s:st) = f' s >>= \x ->
           f st >>= \y ->
           return $ ...

وفي مكان ... أود إعادة [c] جزء من x ++ ال [c] جزء من y مع الاشياء موناد ملفوفة حولها.
هل هناك إمكانية لتحقيق ذلك دون إلغاء التخلص يدويًا x و y ووضع النتيجة يدويًا مرة أخرى؟ هل أحتاج إلى قائمة موناد في أسفل مكدس Monad للحصول على رمز بسيط؟ من الواضح أن موناد القارئ ليس مثالًا على فئة monadplus.

هل كانت مفيدة؟

المحلول

لا أفهم ما تعنيه من خلال إلغاء التغليف x و y.

سيكون لدي السطر الأخير

return (x ++ y)

هل أسيء فهم ما تريد؟

نصائح أخرى

يمكنك أيضًا تحديدها ببساطة

f = fmap concat . mapM f'

(mapM f' xs ينتج قيمة النوع m [[c]], ، أين xs :: [a] و m = StateT Int (Reader b), ، وثم fmap concat يسلط القوائم "داخل الموناد".)

كلاهما f' s و f st هي قيم في موناد واحد ، وهي StateT Int Reader b. لذلك لديك بالفعل x :: [c] و y :: [c] وأنت فقط بحاجة إلى الكتابة return (x ++ y), ، كما قال ديف هينتون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top