কেন `মুদ্রণ <$> (" হ্যালো "মুদ্রণ)“ "হ্যালো" মুদ্রণ করে?


14

যখন গণনা করা হয় IO (IO ()), উভয় (IO ())এবং ()গণনা করা হয়, তাই কেন

main :: IO (IO ())
main = print <$> (print "Hello, World!")

ছাপা

"Hello, World!"

না

IO "Hello, World!" -- ??
"Hello, World!"

3
মূলত fmap print (print "Hello World")এটির printফলাফলের জন্য এটি প্রথম প্যারামিটার, ফাংশনটি প্রয়োগ করে print "Hello World"। এটি কেবল ক্রিয়া সম্পাদনের print ()পরে অনুরোধের সমতুল্য print "Hello World"
রেডু

@ রেদু এটি সঠিক, তবে মনে রাখবেন যে এর প্রার্থনা print ()কখনই মূল্যায়ন হয় না, বা এর ক্রিয়াও সম্পাদিত হয়নি (যা স্টাডাউট প্রিন্ট করবে ())। সুতরাং, "অনুরোধ করার print ()পরে ..." কিছুটা বিভ্রান্তিমূলক (আইএমও)।
চি

উত্তর:


21
main :: IO (IO ())
main = print <$> (print "Hello, World!")

সমতুল্য, monad আইন ধন্যবাদ, যাও

main :: IO (IO ())
main = do 
   result <- print "Hello, World!"
   return (print result)

এখন, printসর্বদা ()ফলাফল হিসাবে ফিরে আসে , সুতরাং পুরো কোড সমান equivalent

main :: IO (IO ())
main = do 
   _ <- print "Hello, World!"
   return (print ())

অবশেষে, ফলাফলটি mainসহজেই বাতিল করা হয়। যে, শেষ লাইন return (putStrLn "this is ignored")একই প্রভাব হতে পারে এবং হতে পারে ।

সুতরাং কোডটি কেবল প্রথমটি কার্যকর করবে print "Hello, World!"

আমি আপনাকে সর্বদা সংজ্ঞায়িত করার পরামর্শ দিচ্ছি main :: IO ()। হাস্কেল আমাদের ঘোষণা করার অনুমতি দেয় main :: IO AnyTypeHereতবে এটি বিভ্রান্তিকর।

আমি আপনাকে ব্যবহার করার পরামর্শ দিচ্ছি putStrLn, এবং printস্ট্রিংগুলি মুদ্রণ না করার জন্য, যেহেতু পরেরটি পুরো স্ট্রিংটি উদ্ধৃত করবে এবং এড়িয়ে যাবে।


5
আমি f <$> a ≡ a >>= \r -> return $ f rএই পরিস্থিতিতে শুধুমাত্র একটি নির্দিষ্ট জিনিস যোগ করতে চাই না, কিন্তু আসলে কোন monad জন্য ধারণ করে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.