سؤال

لدي قائمة من السلاسل، وحاولت ذلك:

ls = [ "banana", "mango", "orange" ]

main = do
       map PutStrLn list_of_strings

هذا لم ينجح، ولا أستطيع أن أفهم السبب.

ghc print-list.hs
print-list.hs:3:0:
    Couldn't match expected type `IO t' against inferred type `[IO ()]'
    In the expression: main
    When checking the type of the function `main'

أي تلميحات؟ أفترض أن الأمر يتعلق بالخريطة إرجاع قائمة وليس قيمة، لكنني لم أجد طريقة سهلة لإصلاح هذا.

في الوقت الوحيد الآن، فإن الطريقة الوحيدة التي أعرفها طباعة قائمة بالسلاسل هي كتابة دالة ستتكشف القائمة، وطباعة كل عنصر (طباعة إذا كانت القائمة [A]، ولكن الطباعة وتكرر إذا كان (a: b)). لكن سيكون كثير أبسط فقط لاستخدام الخريطة ...

شكرا!

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

المحلول

نوع من main الوظيفة يجب أن تكون IO t (أين t هو متغير نوع). نوع من map putStrLn ls يكون [IO ()]. وبعد هذا لماذا تحصل على رسالة الخطأ هذه. يمكنك التحقق من ذلك عن طريق تشغيل ما يلي ghci:

Prelude> :type map putStrLn ls
map putStrLn ls :: [IO ()]

حل واحد للمشكلة هو استخدام mapM, ، وهو نسخة "Monadic" من map. وبعد أو يمكنك استخدام mapM_ وهو نفسه mapM ولكن لا يجمع القيم التي تم إرجاعها من الوظيفة. لأنك لا تهتم بقيمة العودة putStrLn, ، إنه لأكثر ملاءمة للاستخدام mapM_ هنا. mapM_ لديه النوع التالي:

mapM_ :: Monad m => (a -> m b) -> [a] -> m ()

إليك كيفية استخدامها:

ls = [ "banana", "mango", "orange" ]
main = mapM_ putStrLn ls

نصائح أخرى

أجاب أيمن يجعل أكثر الشعور بهذا الموقف. بشكل عام، إذا كان لديك [m ()] و انت تريد m (), ، ثم استخدام sequence_, ، أين m يمكن أن يكون أي موناد بما في ذلك IO.

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