Haskell: لا يمكن استخدام "خريطة Putstrln"؟
سؤال
لدي قائمة من السلاسل، وحاولت ذلك:
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
.