r=read
f x|(a,(c,s:d):_)<-lex<$>lex x!!0=show(r a*r d+r c)++s:d
এটি অনলাইন চেষ্টা করুন!
ব্যাখ্যা
এইচ.পি.উইজ যেহেতু আবিষ্কার করেছেন আমরা এখানে হ্যাস্কেলের লেক্সারটি স্ট্রিং এর অংশগুলিতে ভাঙ্গার জন্য ব্যবহার করতে পারি। (এর আগে আমি ব্যবহার span(>'/')করছিলাম) এবং লাইকোনি দেখিয়েছিলেন যে <$>ঠিক এর মতোই কাজ mapSndকরেData.Tuple ।
প্যাটার্ন গার্ডটি আমাদের কোডটিকে আমরা ব্যবহার করতে চাই এমন তিনটি সংখ্যায় বিভক্ত করে lex। lexপ্রথম টোকেনটি ভেঙে ফেলার জন্য হাস্কেলের লেক্সারকে অনুরোধ জানায়। এটি স্ট্রিংকে বিশ্লেষণের সম্ভাব্য উপায় উপস্থাপন করে প্রতিটি উপাদান সহ একটি তালিকা দেয় returns এই উপাদানগুলি প্রথম উপাদানটি প্রথম টোকেন এবং বাকী স্ট্রিং দ্বিতীয় উপাদান হিসাবে টিপলস হয়। এখন যেহেতু ইনপুট ফর্ম্যাটটি খুব নিয়মিত আমাদের কেবলমাত্র একটি পার্স হতে চলেছে তাই আমরা সর্বদা প্রথমটি নিতে পারি। আমরা প্রথমে lexযেটি করি তা হ'ল ইনপুটটি চাওয়া
lex x
তারপরে আমরা এটির তালিকা থেকে এটি মোছা করি আমাদের একটি 2-টিউপল দেয়
lex x!!0
প্রথম টোকেনটি মিশ্র ভগ্নাংশের পুরো অংশটি ভগ্নাংশটি একটি স্থান দ্বারা স্থির করে এখনও বিশ্লেষণ করতে থাকবে। তারপরে টিউপলস হওয়ায় আমরা টিউপের দ্বিতীয় উপাদানটি প্রয়োগ করতে একটি উপকরণ Functorsব্যবহার করতে পারি ।(<$>)fmaplex
lex<$>lex x!!0
এটি স্পেসের মধ্য দিয়ে খায় এবং আমাদের ভগ্নাংশের অঙ্কের পরবর্তী টোকেনটি ভেঙে দেয়। এখন আমরা এটি ব্যবহার করে একটি প্যাটার্ন ম্যাচে আবদ্ধ করি <-। আমাদের প্যাটার্ন হয়
(a,(c,s:d):_)
aভগ্নাংশের পুরো অংশটি ধরে ফেলবে, আমাদের প্রথম টোকেন। :_আমাদের দ্বিতীয় থেকে ফলটি তালিকার আনপ্রেপ করে lex। cআমরা যে টোকেনটি দিয়েছিলাম তা দ্বিতীয় টোকেন ধরে, এটিই ভগ্নাংশের অঙ্ক n যা থেকে যায় তা আবদ্ধ হয় s:dযা এটিকে তার প্রথম চরিত্রে বিভক্ত করে, এটিকে বিন্যাসের গ্যারান্টিযুক্ত/ এবং বাকীটি হবে যা ডিনোমিনেটর হবে।
এখন আমরা যে ইনপুটটি পার্স করেছি তা আমরা প্রকৃত গণনা করি:
show(r a*r d+r c)++s:d
rআমরা আগে আবদ্ধ ফাংশন কোথায় ।
এটি লক্ষ্য করা জরুরী যে lexএটি একটি তালিকা ব্যর্থ হলে খালি এবং যদি সফল হয় তবে খালি নয় এমন ফিরিয়ে দেয়। কেন এটি Maybeআমি জানি না।