পণ্যের ধরণের সাথে অনুক্রমটি টাইপ করুন


15

আমি একটি সংক্ষেপণমূলক ভাষার জন্য একটি সংকলক নিয়ে কাজ করছি এবং টাইপ অনুমান সমর্থন যোগ করতে চাই। আমি হিন্ডলি-মিলনার বুঝতে পারি, তবে টাইপ থিওরিটি আমি যেতে যেতে শিখছি, সুতরাং এটি কীভাবে খাপ খায় সে সম্পর্কে আমি অনিশ্চিত। নিম্নলিখিত সিস্টেমটি কি শব্দ এবং দৃid়ভাবে অক্ষম?

পদটি আক্ষরিক, পদগুলির সংমিশ্রণ, পদটির একটি উদ্ধৃতি বা আদিম।

e::=x|ee|[e]|…

সমস্ত পদ ফাংশন বোঝায়। এবং দুটি ফাংশনের জন্য , , যা বিপরীত রচনাটি বোঝায়। লিটারালগুলি নীলাদিক কার্যগুলি বোঝায়।ই 2 ই 1e1e2e1e2=e2∘e1

রচনা ব্যতীত অন্যান্য শর্তাদি মৌলিক ধরণের বিধি রয়েছে:

x:ι[Lit]Γ⊢e:σΓ⊢[e]:∀α.α→σ×α[Quot],α not free in Γ

উল্লেখযোগ্যভাবে অনুপস্থিত হ'ল আবেদনের নিয়ম, যেহেতু যুক্তিযুক্ত ভাষাগুলির অভাব রয়েছে।

একটি প্রকার হয় হয় আক্ষরিক, একটি প্রকারের পরিবর্তনশীল, বা স্ট্যাক থেকে স্ট্যাকের কোনও ফাংশন, যেখানে স্ট্যাকটিকে ডান-নেস্টেড টুপল হিসাবে সংজ্ঞায়িত করা হয়। সমস্ত ফাংশন সুস্পষ্টভাবে "বাকী স্ট্যাকের" সম্মানের সাথে বহুত্বপূর্ণ are

τ::=ι|α|ρ→ρρ::=()|τ×ρσ::=τ|∀α.σ

এটি সন্দেহজনক বলে মনে হচ্ছে এমন প্রথম জিনিস, তবে আমি এতে ঠিক কী জানি না এটির মধ্যে কী আছে।

পঠনযোগ্যতা এবং প্রথম বন্ধনী কাটাতে সহায়তা করার জন্য, আমি ধরে নেব যে ধরণের স্কিমগুলিতে । আমি একটি ভ্যারিয়েবলের জন্য একটি একক মানের পরিবর্তে একটি স্ট্যাককে চিহ্নিত করে একটি মূলধনপত্রও ব্যবহার করব।ab=b×(a)

ছয়টি আদিম আছে। প্রথম পাঁচটি বেশ নির্দোষ। dupসর্বোচ্চতম মান নেয় এবং এর দুটি অনুলিপি তৈরি করে। swapশীর্ষ দুটি মানের ক্রম পরিবর্তন করে। popশীর্ষ মান বাতিল। quoteএকটি মান নেয় এবং একটি উদ্ধৃতি (ফাংশন) উত্পাদন করে যা এটি প্রদান করে। applyস্ট্যাকের একটি উদ্ধৃতি প্রয়োগ করে।

dup::∀Ab.Ab→Abbswap::∀Abc.Abc→Acbpop::∀Ab.Ab→Aquote::∀Ab.Ab→A(∀C.C→Cb)apply::∀AB.A(A→B)→B

সর্বশেষcompose দুটি উক্তি গ্রহণ করা উচিত এবং তাদের হবে, । স্ট্যাটিক্যালি টাইপ করা concatenative ভাষায় বিড়াল , ধরণ খুব সহজবোধ্য।[e1][e2]compose=[e1e2]compose

compose::∀ABCD.A(B→C)(C→D)→A(B→D)

যাইহোক, এই ধরণেরটি খুব সীমাবদ্ধ: এটির প্রয়োজন প্রথম ফাংশনের উত্পাদন দ্বিতীয়টির ব্যবহারের সাথে ঠিক মেলে । বাস্তবে, আপনাকে আলাদা আলাদা ধরণের নিতে হবে, তারপরে সেগুলিকে একীভূত করতে হবে। তবে আপনি কীভাবে লিখবেন?

compose::∀ABCDE.A(B→C)(D→E)→A…

যদি আপনি দুটি প্রকারের পার্থক্য বোঝাতে দেন তবে আমি মনে করি আপনি প্রকারটি সঠিকভাবে লিখতে পারেন ।∖compose

compose::∀ABCDE.A(B→C)(D→E)→A((D∖C)B→((C∖D)E))

এটি এখনও তুলনামূলকভাবে এবং একটিcompose ফাংশন নেয় । তার ফলাফলের হ্রাস খরচ উপরে দ্বারা নয় উত্পাদিত , এবং উত্পাদন করে উৎপাদনের উপরে খায় না । এটি সাধারণ রচনার জন্য নিয়ম দেয়।f 2 : D → E B f 2 f 1 D f 1 f 2f1:B→Cf2:D→EBf2f1Df1f2

Γ⊢e1:∀AB.A→BΓ⊢e2:∀CD.C→DΓ⊢e1e2:((C∖B)A→((B∖C)D))[Comp]

তবে, আমি জানি না যে এই হাইপোথিটিক্যাল আসলে যে কোনও কিছুর সাথে মিলে যায় এবং আমি দীর্ঘকাল ধরে চেনাশোনাগুলিতে এটির পিছনে তাড়া করে চলেছি যা আমি মনে করি যে আমি একটি ভুল ঘুরিয়ে নিয়েছি। এটি tuples একটি সহজ পার্থক্য হতে পারে?∖

∀A.()∖A=()∀A.A∖()=A∀ABCD.AB∖CD=B∖D iff A=Cotherwise=undefined

এ সম্পর্কে কি ভয়াবহভাবে কিছু ভেঙে গেছে যা আমি দেখছি না, বা আমি সঠিক ট্র্যাকের মতো কিছুতে রয়েছি? (আমি সম্ভবত এই জিনিসগুলির কিছুটিকে ভুলভাবে পরিমাণমুক্ত করেছি এবং সেই অঞ্চলে সংশোধনকেও প্রশংসা করব))


আপনার ব্যাকরণে আপনি কীভাবে ভেরিয়েবল ব্যবহার করবেন? আপনার প্রয়োজন মনে হয় এমন "সাব টাইপিং" পরিচালনা করতে এই প্রশ্নের সাহায্য করা উচিত।
— jmad

1
@ জ্যামদ: আমি নিশ্চিত না যে আমি প্রশ্নটি বুঝতে পেরেছি। প্রকারের ভেরিয়েবলগুলি কেবল প্রথাগতভাবে টাইপ স্কিমগুলি সংজ্ঞায়নের জন্য রয়েছে এবং ভাষাতে নিজেই ভেরিয়েবলগুলি নেই, কেবল সংজ্ঞা, যা [পারস্পরিক] পুনরাবৃত্তি হতে পারে।
— জন পুরি

যথেষ্ট ফর্সা। আপনি কি বলতে পারেন (সম্ভবত একটি উদাহরণ সহ) এর বিধিটি composeকেন খুব বাধাজনক? আমার ধারণা আছে যে এটি ঠিক আছে। (যেমনC=D
— -ক্যালকুলাসের

@ জ্যামাদ: অবশ্যই twiceহিসাবে সংজ্ঞায়িত বিবেচনা করুন dup compose apply, যা একটি উদ্ধৃতি গ্রহণ করে এবং এটি দুটিবার প্রয়োগ করে। [1 +] twiceঠিক আছে: আপনি টাইপের দুটি ফাংশন রচনা করছেন । তবে তা নয়: যদি , সমস্যাটি হ'ল A ≠ A∀ এ বি ।ι→ι[pop] twice∀Ab.f1,f2:Ab→AA≠Ab∀Ab.Abb→Acompose

উত্তর:


9

compose:∀ABCδ.δ (∀α.α A→αB) (∀β.β B→βC)→δ (∀γ.γ A→γC)

গ্রীক অক্ষরগুলি কেবলমাত্র স্বচ্ছতার জন্য বাকী-স্ট্যাক ভেরিয়েবলের জন্য ব্যবহৃত হয়।

B

টাইপ চেক র‌্যাঙ্ক -২ প্রকারটি সাধারণভাবে অনস্বীকার্য, আমি বিশ্বাস করি, যদিও এমন কিছু কাজ করা হয়েছে যা অনুশীলনে ভাল ফলাফল দেয় (হাস্কেলের পক্ষে):

  • সাইমন এল। পেটন জোন্স, ডিমিট্রিয়াস ভাইটিনিওটিস, স্টেফানি ওয়েইরিচ, মার্ক শিল্ডস: স্বেচ্ছাসেবী-র‌্যাঙ্কের ধরণের প্র্যাক্টিকাল টাইপের অনুক্রম। জে ফান্ট কার্যক্রম. 17 (1): 1-82 (2007)

রচনার জন্য টাইপ বিধিটি কেবলমাত্র:

Γ⊢e1:∀α.α A→α BΓ⊢e1:∀α.α B→α CΓ⊢e1 e2:∀α.α A→α C

টাইপ সিস্টেমটি সাধারণভাবে কাজ করতে, আপনাকে নিম্নলিখিত বিশেষজ্ঞের নিয়মটি প্রয়োজন:

Γ⊢e:∀α.α A→α BΓ⊢e:∀α.C A→α C B

dup +ι→ι+ιι→ι

1
স্ট্যাকের প্রকারগুলি স্ট্যাকের টুকরোগুলির উপরে পরিমাণ নির্ধারণ করে, সুতরাং দুটি আর্গুমেন্ট ফাংশন নিয়ে কাজ করার ক্ষেত্রে কোনও সমস্যা নেই। আপনি কীভাবে এটি উপরোক্তভাবে dup +সংজ্ঞায়িত করেছেন, এটি কম্পোজ ব্যবহার করে না বলে এটি কীভাবে প্রযোজ্য তা আমি নিশ্চিত নই ।
— ডেভ ক্লার্ক

[dup] [+] composeαবিবি×αবি=ι×ι(ι×ι)×αι×(ι×α)

আমি আমার স্ট্যাকটি ভুল দিকে চালাচ্ছি। আমি বাসা বাঁধার বিষয়টি মনে করি না, যতক্ষণ না স্ট্যাক তৈরির জোড়গুলি প্রোগ্রামিং ভাষায় উপস্থিত না হয়। (আমি আমার উত্তর আপডেট করার পরিকল্পনা করছি, তবে প্রথমে একটু গবেষণা করা দরকার))
— ডেভ ক্লার্ক

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