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
ব্যবহার করতে পারি ।(<$>)
fmap
lex
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
আমি জানি না।