হ্যাসকেলে সংক্ষিপ্ততম -> বি -> (ক -> খ) ফাংশন


19

আমি একটি পরীক্ষায় নিম্নলিখিত প্রশ্ন পেয়েছি:

fনিম্নলিখিত ধরণের সাথে একটি ফাংশন লিখুন a -> b -> (a -> b)aএবং bকোন অর্থে আবদ্ধ করা উচিত নয় খাটো কোড, ভালো।

আমি সাথে এসেছি f a b = \x -> snd ([a,x],b) । আপনি কিছু ক্ষুদ্র কিছু খুঁজে পেতে পারেন?

বর্তমানে বিজয়ী হলেন: f _=(.f).const


একটি সাধারণ টাইপ অনুমতি দেওয়া হয় এমন: f = const const
হামার

@hammar: অথবা f _ b _ = b, কিন্তু, প্রশ্নে সমাধান দেওয়া, আমি একটি সাধারণ টাইপ করা হয় সন্দেহ না করে।
টিখন জেলভিস

6
যদি আরও সাধারণ ধরণের অনুমতি দেওয়া হয় তবে কেন নয় f = id?
টম এলিস

7
আসলে যদি আরও সাধারণ ধরণের অনুমতি দেওয়া হয় তবে f = fএটি একটি সমাধান, তাই আমি অনুমান করি যে প্রকারের শর্তগুলি খুব গুরুত্বপূর্ণ!
টম এলিস

2
আরও সাধারণ ধরণের অনুমতি নেই, আপনার অনুমানগুলি সঠিক ছিল।
রাদু স্টোয়েনেস্কু

উত্তর:


11

ডান হাতের বেনামে ফাংশন থেকে মুক্তি পেয়ে আপনার উদাহরণ সঙ্কুচিত করা যেতে পারে:

f a b x = snd ([a,x],b)

এটি কাজ করে কারণ প্রকারটি হাস্কেলের a -> b -> a -> bসমতুল্য a -> b -> (a -> b)


4
সামান্য সংক্ষিপ্ত পরিবর্তন:f a b x = snd (f x,b)
এড'কা

5

ফাংশনটি f _=(.f).constআসলে একাধিক সাধারণ ধরণের f :: a -> b -> (a -> b), যাহাতে f :: a -> b -> (c -> b)। যদি কোনও ধরণের স্বাক্ষর দেওয়া না হয় তবে প্রকারের ইনফারেন্স সিস্টেমটি এক প্রকারের অনুমান করে f :: a -> b -> (a -> b), তবে আপনি যদি f :: a -> b -> (c -> b)সঠিক একই সংজ্ঞা সহ প্রকারের স্বাক্ষরটি অন্তর্ভুক্ত করেন, তবে হাস্কেল ইস্যু ছাড়াই এটি সংকলন করবে এবং চ এর আংশিক অ্যাপ্লিকেশনগুলির জন্য ধারাবাহিক প্রকারের প্রতিবেদন করবে। এক্ষেত্রে টাইপ চেকিং সিস্টেমের চেয়ে টাইপ ইনফারেন্স সিস্টেমটি আরও কঠোর হওয়ার সম্ভবত কিছু গভীর কারণ রয়েছে তবে কেন এটি হওয়া উচিত তা নিয়ে কোনও কারণ নিয়ে আসতে পর্যাপ্ত বিভাগের তত্ত্বটি আমি বুঝতে পারি না। আপনি যদি স্বাক্ষরিত না হন তবে নিজে চেষ্টা করে দেখতে আপনাকে স্বাগত জানাই।


ক্ষেত্রে মত হতে পারে f a b = f a a। এটি টাইপ হতে a -> a -> bঅনুমান করে যদিও এটি ধরণের সাথে সম্মতি দেয় a -> b -> c। এটি কারণ যদি fকোনও প্রকার না দেওয়া হয় তবে এটি কেবল মনোমोर्ফিকভাবে ব্যবহার করতে পারে।
গর্বিত হাসেলেলার

আমি মনে করি না যদিও এটি হওয়া উচিত
গর্বিত হাসেলেলার

4

দেওয়া হয়েছে ScopedTypeVariables, আমি এটি নিয়ে এসেছি:

f (_::a) b (_::a) = b

আপনি যদি আমার এবং আমার উভয় ফাংশন সঙ্কুচিত করেন তবে আমার চুল ছোট হয়:

f(_::a)b(_::a)=b
f a b x=snd([a,x],b)

অবশ্যই, আপনি সম্ভবত নির্ভর করতে পারবেন না ScopedTypeVariables: পি।


3
এটি f _=(.f).const( সাসা এনএফের কারণে ) এর মতো সংক্ষিপ্ত নয় । যারও দরকার নেই ScopedTypeVariables
ঘড়ির

হুম, আমি প্রথমে ভেবেছিলাম তালিকার জন্য এটি প্রথম এবং তৃতীয় যুক্তিগুলির প্রয়োজন ...
ক্রিস টেলর

@ ক্রিসটেলর: মনের উপর অনেক বেশি ওকামল? :)
টিখন জেলভিস

হাহ, অবশ্যই! ;)
ক্রিস টেলর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.