পয়েন্টফ্রি তে টুপল সংযোজন


16

সংক্ষিপ্ততম উপায়টি কী আমরা ফাংশনটি প্রকাশ করতে পারি

f(a,b)(c,d)=(a+c,b+d)

বিন্দু মুক্ত স্বরলিপি?

pointfree.io আমাদের দেয়

uncurry (flip flip snd . (ap .) . flip flip fst . ((.) .) . (. (+)) . flip . (((.) . (,)) .) . (+))

যা সামান্য বিট কাজের সাথে সংক্ষিপ্ত করা যেতে পারে

uncurry$(`flip`snd).((<*>).).(`flip`fst).((.).).(.(+)).flip.(((.).(,)).).(+)

76 বাইট জন্য। কিন্তু এই এখনও মনে হয় সত্যিই দীর্ঘ এবং জটিল যেমন একটি সহজ কাজের জন্য। একটি সংক্ষিপ্ত বিন্দু মুক্ত ফাংশন হিসাবে আমরা যুক্ত করে যুক্ত করার উপায় আছে কি?

বিন্দু মুক্ত বলতে আমি কী বোঝাতে চাই তা স্পষ্ট করে ফাংশনটির পয়েন্ট-ফ্রি ঘোষণার মধ্যে বিদ্যমান ফাংশন এবং অপারেটরদের গ্রহণ এবং একে অপরের সাথে এমনভাবে প্রয়োগ করা হয় যাতে কাঙ্ক্ষিত ফাংশনটি তৈরি হয়। ব্যাকটিক, প্রথম বন্ধনী এবং আক্ষরিক মান ( [], 0, [1..3], ইত্যাদি) অনুমতি দেওয়া হয় কিন্তু মত কীওয়ার্ড whereএবং letনয়। এর অর্থ:

  • আপনি কোনও ভেরিয়েবল / ফাংশন বরাদ্দ করতে পারেন না

  • আপনি ল্যাম্বডাস ব্যবহার করতে পারেন না

  • আপনি আমদানি নাও করতে পারেন

এটি যখন সিএমসি ছিল তখন একই প্রশ্ন


9
আমি কখনই বুঝতে পারি নি যে কেন এটি " পয়েন্ট- ফ্রি " বলা হয় যখন এটি আসলে পয়েন্টে পূর্ণ থাকে । : পি
মিঃ এক্সকোডার


5
এটি লজ্জার বিষয় যে আমাদের সেরা হাস্কেল প্যাকেজটি আমদানির অনুমতি নেই, অন্যথায় সমাধানটি কেবল এটিই হবে (+)***(+)
সিলভিও মায়োলো

2
একটি ধারণা: (+)<$>([1],2)<*>([3],4)দেয় ([1,3],6)
xnor

2
আমি এক্সনোর টিপ ব্যবহার করে একটি সূক্ষ্ম সমাধান তৈরি করার চেষ্টা করে কিছু সময় ব্যয় করেছি ... তবে আমি এই আবর্জনা দিয়ে শেষ করেছি । আমি মাঝে মাঝে কেন চেষ্টা করি তাও আমি জানি না ...
সম্পূর্ণরূপে

উত্তর:



8

44 বাইট

-8 বাইটস ধন্যবাদ অর্জান জোহানসেনকে। -3 বাইট ব্রুস ফোর্টের ধন্যবাদ।

(.).flip(.)<*>(zipWith(+).)$mapM id[fst,snd]

এটি অনলাইন চেষ্টা করুন!

অনুবাদসমূহ:

f t1 t2 = zipWith (+) (mapM id [fst, snd] $ t1) (mapM id [fst, snd] $ t2)

67 বাইট

-8 বাইটস ধন্যবাদ অর্জান জোহানসেনকে। -1 বাইট ধন্যবাদ ব্রুস ফোর্টের কাছে।

যদি টিপল আউটপুট প্রয়োজন হয়:

(((,).head<*>last).).((.).flip(.)<*>(zipWith(+).)$mapM id[fst,snd])

এটি অনলাইন চেষ্টা করুন!

হ্যাঁ, আমি নিজেই এটি করে পাকা ফল দেয় না। তবে আমি [a] → (a, a)ধর্মান্তরিত হয়ে খুশি ।

listToPair  [a]  (a, a)
listToPair = (,) . head <*> last
-- listToPair [a, b] = (a, b)

এখন যদি একটি সংক্ষিপ্ত ফাংশন ছিল m (a → b) → a → m b


3
এটি আপনার কাছে ভেঙে দেওয়ার জন্য ঘৃণা, তবে mapM id[fst,snd]খাটো।
janrjan জোহানসেন

দুঃখের বিষয়, আপনি সম্ভবত যে ফাংশনটি সন্ধান করছেন mapM idতার গল্ফযুক্ত সংস্করণ sequence
janrjan জোহানসেন

হাঁ সত্য যে. আমি স্রেফ (<*>)স্বাক্ষরটি দেখছি যা এটি m (a → b) → m a → m b। এত কাছে ...
সম্পূর্ণরূপে

1
এছাড়াও রয়েছে Control.Lens.??, যা বেস সময়ে অন্তর্ভুক্তির জন্য প্রস্তাবিত হতে পারে।
janrjan জোহানসেন

আমি পুনরাবৃত্ত (.mapM id[fst,snd])মতো let r=(.mapM id[fst,snd]) in r(r.zipWith(+))পছন্দটি বের করতে চাই তবে আমি টাইপচেকারকে পয়েন্টফ্রি সংস্করণ গ্রহণ করতে সক্ষম হতে পারিনি।
xnor

4

54 বাইট

আমি সত্যই সন্দেহ করি যে আমরা @ এইচ.পি.উইজের ৪৪ বাইট সমাধান সমাধান করব, কিন্তু কেউ (,)এই ধরণের শ্রেণি প্রয়োগ করে এমন সত্যটি ব্যবহার করছে না Functor, সুতরাং এখানে আরও একটি আকর্ষণীয় বিষয় খুব খারাপ নয়:

((<*>snd).((,).).(.fst).(+).fst<*>).flip(fmap.(+).snd)

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

2- টিপলসের Functorজন্য ধরণের শ্রেণীর প্রয়োগের সাথে ( বেস-4.10.1.0 থেকে ) খুব মিল রয়েছে :Either

instance Functor ((,) a) where
    fmap f (x,y) = (x, f y)

instance Functor (Either a) where
    fmap _ (Left x) = Left x
    fmap f (Right y) = Right (f y)

এই চ্যালেঞ্জটির জন্য এর অর্থ কী, দ্বিতীয় যুক্তির প্রথম উপাদানটি রাখার সময় নিম্নলিখিত ফাংশনটি দ্বিতীয় উপাদান যুক্ত করে:

λ f = fmap.(+).snd :: Num a => (a, a) -> (a, a) -> (a, a)
λ f (1,-2) (3,-4)
(3,-6)

সুতরাং কেবলমাত্র যদি আমরা কিছুটা সাহায্যকারী পেয়ে থাকি তবে helpPlz = \a b -> (fst a+fst b,snd b)আমরা করতে পারি (helpPlz<*>).flip(fmap.(+).snd)এবং হয়ে যায়। ভাগ্যক্রমে আমাদের কাছে এমন সরঞ্জাম রয়েছে pointfreeযা আমাদের দেয়:

helpPlz = (`ap` snd) . ((,) .) . (. fst) . (+) . fst

সুতরাং কেবল সেই ফাংশনটি প্লাগ ইন করেই আমরা উপরের সমাধানটিতে পৌঁছেছি ( (<*>) = apএটি বেসে রয়েছে তা নোট করুন )।


4

60 বাইট

আমি uncurryএখানে কোনও প্রেম দেখছি না , তাই আমি বুঝতে পেরেছিলাম যে আমি পপ করব এবং এটি ঠিক করব।

uncurry$(uncurry.).flip(.)(flip(.).(+)).(flip(.).((,).).(+))

আমি ভেবেছিলাম, সমস্তটির সাথে fstএবং snd, যে যুক্তিগুলি প্যাক করে দিয়ে uncurryকিছু ফল দিতে পারে। স্পষ্টতই, আমি আশানুরূপ ফলপ্রসূ ছিল না।


2
uncurryতাই ভার্জোজ। :( কিন্তু আপনি দূরতম বন্ধনী সহ প্রতিস্থাপন করতে পারেন $
Orjan Johansen

হ্যাঁ, এবং দুর্ভাগ্যক্রমে এটি হ্যাসকেলে প্রচুর ফাংশনের নাম নিয়ে সমস্যা। গল্ফ করার জন্য খুব দীর্ঘ। তবে 1-অক্ষর সাশ্রয়ের জন্য ধন্যবাদ!
সিলভিও মায়োলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.