سؤال

ما يجب علي فعله بشكل أساسي هو كتابة دالة تأخذ قائمة من النوع [(String, String)] ويطبع المحتويات بحيث يبدو الإخراج سطرًا تلو الآخر كما يلي:

FirstString : SecondString

FirstString : SecondString

.. الخ، لكل عنصر في القائمة.لقد حصلت على الكود التالي وهو يطبعه، ولكن لسبب ما يطبع سطرًا يحتوي على [(),()] في نهايةالمطاف.

display :: Table -> IO ()
display zs = do { 
    xs <- sequence [putStrLn ( a ++ " = " ++ b) | (a, b) <- zs];
    print xs 
}

هل هناك أي شيء أفعله خطأ؟

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

المحلول

ووXS الطباعة النهائية غير ضرورية. تسلسل هنا تعود حفنة من () ق (قيمة الإرجاع putStrLn)، وطباعة طباعة هذا الخروج كذلك.

وبينما كنت في ذلك، والآن هو ذهب أن XS الطباعة، يمكنك التخلص من الربط XS متغير، وجعل تسلسل في sequence_ لتتخلص من قيمة الإرجاع، وإعطاء:

display :: Table -> IO()
display zs = sequence_ [putStrLn (a++" = "++b) | (a,b) <- zs]

نصائح أخرى

هل يمكن حتى استخدام mapM:

display :: Table -> IO ()
display = mapM_ (\(a,b) -> putStrLn (a++" = "++b))

أتفق مع ja أنه يجب عليك تقسيم الكود الخاص بك إلى وظيفتين:

  • أ نقي جزء:وظيفة تأخذ بنية البيانات الخاصة بك وتحولها إلى سلسلة
  • ان غير نقية الجزء الذي يعرض هذه السلسلة إلى وحدة التحكم

إليك تنفيذ بسيط:

showTable :: Table -> String
showTable xs = concatMap format xs
  where
    format (a, b) = a ++ " : " ++ b ++ "\n"

display :: Table -> IO ()
display table = putStr (showTable table)

هذا التصميم له ميزتان:

أولاً، معظم "المنطق" الخاص بك موجود في الجزء الخالص من الكود، وهو أمر لطيف، بطريقة برمجة وظيفية.

ثانيًا، وهذا مجرد مبدأ بسيط في هندسة البرمجيات؛لديك الآن وظيفة قابلة لإعادة الاستخدام يمكنك استخدامها، إذا كنت ترغب في تنسيق بنية البيانات الخاصة بك في جزء آخر من التعليمات البرمجية الخاصة بك (يبدو ذلك محتملًا).

وكتابة دالة التي تأخذ الصفوف (tuple) إلى سلسلة مهيأ كما يحلو لك.
ثم concatMap أن وظيفة على قائمتك. طباعة النتيجة.

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