আমাদের মানচিত্র, এফএমএপ এবং লিফটম কেন আছে?


102
map :: (a -> b) -> [a] -> [b]

fmap :: Functor f => (a -> b) -> f a -> f b

liftM :: Monad m => (a -> b) -> m a -> m b

আমাদের তিনটি আলাদা ফাংশন কেন মূলত একই জিনিসটি করে?


32
ইতিহাস, বেশিরভাগ ক্ষেত্রে। শিক্ষাজাগত কারণে এফএমএপি মানচিত্র থেকে পৃথক, লিফটএম historicalতিহাসিক কারণে (যথা
ফান্টর মনোদের

12
ওহ, এবং কেবল পরিষ্কার হওয়ার জন্য: তারা "মূলত" একই জিনিস করে না। উভয় mapএবং liftMঅবশ্যই করা উচিৎ ঠিক একই জিনিস fmap
সিএ ম্যাকক্যান

2
ঠিক একই জিনিসটি করার সময় fmapএবং করা অবশ্যই অবশ্যই তাদের একটি বিশেষ ঘটনা, অর্থাত্ কিছু আলাদা। ভাল টাইপ করা হয়, যেখানে না। liftMmapfmap id getLinemap id getLine
থার্স্টেন

উত্তর:


91

mapতালিকাগুলিতে এবং historicalতিহাসিক কারণে অপারেশনকে সহজ করার জন্য উপস্থিত রয়েছে ( এফএমএপ থাকাকালীন হাস্কেলের মানচিত্রের বিন্দুটি কী তা দেখুন ? )।

আমাদের জিজ্ঞাসা করতে হবে কেন আমাদের আলাদা মানচিত্রের কার্যকারিতা প্রয়োজন। কেন কেবলমাত্র বর্তমান তালিকার কেবল মানচিত্রের ফাংশনটি বাদ দিয়ে, এবং পরিবর্তে মানচিত্রে fmap নামকরণ করবেন? ঠিক আছে, এটি একটি ভাল প্রশ্ন। সাধারণ যুক্তিটি হ'ল যে কেউ হাসকলকে শিখছে, মানচিত্রটি ভুলভাবে ব্যবহার করার সময়, ফান্ট্যাক্টরের চেয়ে তালিকাগুলির চেয়ে ত্রুটি দেখতে পাবে।

- টাইপক্লাসোপিডিয়া , পৃষ্ঠা 20

fmapএবং liftMঅস্তিত্ব রয়েছে কারণ হানডেলগুলি হ্যাশকেলে স্বয়ংক্রিয়ভাবে ফান্টেক্টর ছিল না:

আমাদের এফএমএপি এবং লিফটএম উভয়ই যে দুর্ভাগ্যজনক ফলাফল তা হ'ল যে মোনাদ টাইপ শ্রেণীর কোনও ফান্টর উদাহরণ প্রয়োজন হয় না, যদিও গাণিতিকভাবে বলা হয়, প্রতিটি মনাদ একটি ফান্টেক্টর। তবে, এফএমএপ এবং লিফটএম মূলত বিনিময়যোগ্য, যেহেতু এটি কোনও বাগ (প্রযুক্তিগত দিক থেকে একটি সামাজিক দিক থেকে) কোনও ধরণের ফান্টাকারের উদাহরণ না হয়েও মোনাদের উদাহরণ হতে পারে।

- টাইপক্লাসোপিডিয়া , পৃষ্ঠা 33

সম্পাদনা: আগস্টাসের ইতিহাস mapএবং fmap:

আসলে এটি হয় না। যা ঘটেছিল তা হ্যাসেল ১.৩ এ ফান্টেক্টরটি coverাকতে মানচিত্রের ধরণটি সাধারণ করা হয়েছিল। অর্থাত, হাস্কেলের ১.৩ এফএম্যাপকে মানচিত্র বলা হয়েছিল। এরপরে এই পরিবর্তনটি হ্যাস্কেল ১.৪ এ ফিরিয়ে দেওয়া হয়েছিল এবং এফএমএপি চালু হয়েছিল। এই পরিবর্তনের কারণ ছিল শিক্ষাগত; যখন হাস্কেলকে শিখিয়েছিলেন খুব সাধারণ ধরণের মানচিত্র ত্রুটি বার্তাগুলি বুঝতে আরও অসুবিধা হয়। আমার মতে এটি সমস্যা সমাধানের সঠিক উপায় ছিল না।

- হাস্কেলের মানচিত্রের বিন্দুটি কী, যখন এফএমএপ থাকে?


13
এবং, আমার দৃষ্টিকোণ থেকে, যিনি প্রথমবারের মতো @ অগাস্টস এর বর্ণনার পরিবর্তনের পরে দশকটিরও বেশি আগে হাস্কেলের মুখোমুখি হয়েছিলেন এবং এখন যে ভাষাটি শিখছেন তাদের সহায়তা করতে অনেক সময় ব্যয় করেছেন, এটি এমনকি স্পষ্ট নয় যে এটি এমনকি এতে সহায়তা করেছিল যে কোনও উপায়ে অবশ্যই অকেজো রিডানডেনসি অফসেট করার পক্ষে যথেষ্ট নয় (যা নিজেই মানুষকে এর মতো প্রশ্ন জিজ্ঞাসা করে); Functorবর্গ খুব উপেক্ষা করার সাধারণ, এবং beginners প্রায়ই যাহাই হউক না কেন ত্রুটি বার্তা দ্বারা বিভ্রান্ত হয়!
সিএ ম্যাকক্যান

10
আমরা কি সরাতে পারি না liftM? কোডটি বিরতি দেওয়া যাক, কে চিন্তা করে, সাধারণত গিথুবে কোড স্থির করতে এবং তারপরে হ্যাকারেজে আপলোড করতে সাধারণত 2 দিনেরও কম সময় লাগে। নাকি আমি বন্য ও পাগল হয়ে যাচ্ছি?
তারশ্যাচ

1
@Tarrasch: সকলেই ব্যবহার GitHub না সমস্ত প্যাকেজ সময়মত আপডেট করা হচ্ছে একটি মহান ট্র্যাক রেকর্ড আছে, এবং আমি এক ব্যবহারের প্রবণতা liftMএকটি do-ব্লকে থাকাকালীন বদলে fmapকারণ এটি ভাল মধ্যে ফিট করে যখন আমি ব্যবহার liftM2ইত্যাদি যেমন.
ivanm

1
@ এল 01 জন লোক এতে কাজ করেছে; দেখতে stackoverflow.com/questions/5730270/... : এবং সাংখ্যিক শ্রেণীর জন্য অন্তত, সেখানে বিকল্প আছে hackage.haskell.org/packages/archive/numeric-prelude/0.3.0.2/...
li.davidm

1
@ L01man হ্যাঁ এটি শীঘ্রই ঠিক করা হবে। আবেদন একসংখ্যা প্রস্তাবনা (, AMP) মত Haskell, এর পরবর্তী সংস্করণ মধ্যে পাস হবে বলে মনে হচ্ছে। GHC 7.8.3 এর --fwarn-ampরূপান্তরটির জন্য বিদ্যমান কোডটি আপডেট করতে সহায়তা করার জন্য একটি নতুন পতাকা রয়েছে ।
recursion.ninja
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.