'A ->' টাইপের এমএল ফাংশন বি


19

আমাদের প্রফেসর আমাদের ওসিএএমএলে এমন কোনও ফাংশন সম্পর্কে চিন্তা করতে বলেছিলেন যা টাইপটি রয়েছে

'a -> 'b

অর্থাত্ একটি যুক্তি একটি ফাংশন যা কিছু হতে পারে, এবং এটি ভিন্ন কিছু ফিরে আসতে পারে।

আমি raiseএমন কোনও ফাংশন ব্যবহার করার কথা ভেবেছিলাম যা এর যুক্তি উপেক্ষা করে:

let f x = raise Exit

তবে অধ্যাপক বলেছিলেন যে একটি সমাধান রয়েছে যার জন্য স্ট্যান্ডার্ড লাইব্রেরিতে কোনও ফাংশনের প্রয়োজন নেই। আমি বিভ্রান্ত: 'bপ্রথম স্থান না থাকলে আপনি কীভাবে এটি তৈরি করতে পারেন?

আমি স্ট্যাক ওভারফ্লোয়ের চেয়ে এখানে জিজ্ঞাসা করছি কারণ আমি কী চাইছে তা বুঝতে চাই, আমি কেবল কোনও ব্যাখ্যা ছাড়াই একটি প্রোগ্রাম দেখতে চাই না।


2
আপনার উত্তরটিতে CS101 শিক্ষার্থী শেখার প্রোগ্রামিংকে লক্ষ্য করুন, আপনার উত্তরটি তাঁকে পরবর্তী হয়ে উঠতে অনুপ্রেরণা জাগাতে পারে এমন ধরণের তাত্ত্বিক নয়।
গিলস 11:32

আপনি যদি ব্যাখ্যা করেন যে কীভাবে এটি কার্যকর হবে তা আপনি যদি ব্যাখ্যা করেন তবে raiseআপনার প্রোফেসর যে সমাধানটির সন্ধান করছেন (যে একই কারণে কাজ করে একই কারণে raiseকাজ করবে) কীভাবে কাজ করে তা ব্যাখ্যা করা আমাদের পক্ষে সবচেয়ে ভাল ।
sepp2k

@ sepp2k raise : exn -> 'aযাতে আমি ফেরতের মান পেতে পারি, আমি কেবল যুক্তি উপেক্ষা করছি।
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'


উত্তর:


18

কঙ্কাল হয় let f x = BODY। দেহে আপনাকে অবশ্যই জেনেরিক উপায়ে এক্স ব্যবহার করতে হবে (উদাহরণস্বরূপ, এটি এমন কোনও ফাংশনে প্রেরণ করবেন না যা পূর্ণসংখ্যার প্রত্যাশা করে), এবং আপনাকে অবশ্যই অন্য কোনও ধরণের মান প্রদান করতে হবে । তবে পরবর্তী অংশটি কীভাবে সত্য হতে পারে? সমস্ত ধরণের ক্ষেত্রে "বিবৃতিটি সন্তুষ্ট করার একমাত্র উপায় 'b, প্রত্যাবর্তিত মান হ'ল ধরণের মান'b " ফাংশনটি ফিরে না আসে তা নিশ্চিত করা । ঠিক দুটি সম্ভাবনা রয়েছে: হয় দেহ ত্রুটি বা এটি শেষ হয় না। ফাংশন raiseত্রুটিযুক্ত, নিম্নলিখিতটি শেষ করে না:

let rec f x = f x

19

প্রথম, কিছু মন্তব্য। কেবলমাত্র মূল টাইপযুক্ত ল্যাম্বদা ক্যালকুলাস ব্যবহার করে এটি পাওয়া সম্ভব নয়'a -> 'b কারণ টাইপিং সিস্টেমটি ( কারি হাওয়ার্ড আইসোমরফিজমের মাধ্যমে ) স্বজ্ঞাত যুক্তিবিদ্যায় এবং সংশ্লিষ্ট সূত্রের চিঠিপত্রের মধ্যে রয়েছেA → B কোনও টাউটোলজি নয়।

অন্যান্য এক্সটেনশন যেমন টিপলস এবং ম্যাচিং / শর্তাদি এখনও কিছু যুক্তিযুক্ত ধারাবাহিকতা সংরক্ষণ করে *যা পণ্যের ধরণের যুক্তিযুক্ত সংযোজকের সাথে মিলে যায় এবং , এবং সমষ্টি ধরনের |যা মিলা বা । আবার, তাদের এ 'a -> 'bধরণের উত্পাদনের আশা করবেন না , কারণ এটি এমন কোনও সূত্র প্রমাণ করার সুযোগ দেয় যা কোনও টাউটোলজি নয়।

সুতরাং আপনার একমাত্র সম্ভাবনা অন্যান্য নির্মাণগুলি ব্যবহার করছে যা লজিকগুলি থেকে দূরে থাকে raise(তবে আপনাকে এই ক্ষেত্রে অনুমতি দেওয়া হয় না) ... বা let rec! পুনরাবৃত্তি এমন কর্মসূচি তৈরি করতে দেয় যা কখনই শেষ হয় না এবং তাদের ফলাফলগুলি কখনই উত্পাদিত হবে না এমন একটি নির্বিচারে রিটার্ন টাইপ দেওয়া যেতে পারে। এখন আপনি যদি সবচেয়ে তুচ্ছ নন টার্মিনেটিং ফাংশন (যা নিজেকে সরাসরি ফলাফল হিসাবে ডেকে আনে সরাসরি ডাকে) সম্পর্কে চিন্তা করে:

let rec f x = f x

আপনি দেখতে পাবেন যে এর ধরণটি ঠিক is 'a -> 'b : প্রদত্ত যুক্তি যা-ই হোক না কেন, ফলাফল (যা কখনই গণনা করা হবে না) কোনও ধরণের বলে ধরে নেওয়া যেতে পারে।

অবশ্যই এটি fএকটি আকর্ষণীয় ফাংশন নয়, তবে এটিই মূল বিষয়। ওক্যামেলে, কোনও ফাংশন যার প্রকারটি বৈধ সূত্রের মতো দেখায় না এটি সন্দেহজনক ফাংশন।


প্রশ্নকারী আপনার প্রথম দুটি অনুচ্ছেদের একটি শব্দ বুঝতে পারেনি তবে আমি আপনার বাক্যটি পছন্দ করি "তাদের ফলাফলগুলি একটি স্বেচ্ছাসেবী রিটার্ন টাইপ দেওয়া যেতে পারে কারণ সেগুলি কখনই উত্পন্ন হবে না"।
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'

1

একটি সংকলক আদিম ব্যবহার করে আপনি এটি লিখতে পারেন:

external magic: 'a -> 'b = "%identity"

(এবং প্রকৃতপক্ষে সংকলক বিতরণ এটি সরবরাহ করে, যদিও ভাষার অংশ নয়)। এটি একটি অনিরাপদ পরিচয় castালাই।

আপনার অধ্যাপক প্রায় অবশ্যই এটি চান না। যাইহোক, টাইপ সহ এটি কেবলমাত্র কার্যকর ফাংশন যা 'a -> 'bসম্পর্কে আমি সচেতন এবং এটি ওসিএএমএল বিতরণে নিজেই ব্যবহৃত হয়।

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