কেবলমাত্র হিন্দি-মিলনার টাইপ সিস্টেম ব্যবহার করে একটি তালিকা নির্ধারণ করুন


10

আমি একটি ছোট ল্যাম্বডা ক্যালকুলাস সংকলকটিতে কাজ করছি যার একটি ওয়ার্কিং হিন্ডলি-মিলনার ধরণের ইনফারেন্স সিস্টেম রয়েছে এবং এটি এখন পুনরাবৃত্তির ক্ষেত্রেও সমর্থন করে (লিঙ্কযুক্ত কোডে নয়), যা আমি বুঝতে পেরেছি এটি টুরিং সম্পূর্ণ করার জন্য যথেষ্ট হওয়া উচিত

এখন সমস্যাটি হ'ল এটিকে কীভাবে তালিকাগুলি সমর্থন করতে হবে বা এটি ইতিমধ্যে তাদের সমর্থন করে কিনা এবং আমার কেবল তাদের এনকোড করার জন্য কোনও উপায় খুঁজে বের করতে হবে কিনা আমার কোনও ধারণা নেই। আমি টাইপ সিস্টেমে নতুন নিয়ম যুক্ত না করে এগুলি সংজ্ঞায়িত করতে সক্ষম হতে চাই।

সবচেয়ে সহজ উপায় আমি একটি তালিকা মনে করতে পারেন xকিছু হয় যে হিসাবে null(অথবা খালি তালিকা), অথবা একটি যুগল উভয় একটি রয়েছে xএবং একটি তালিকা x। তবে এটি করার জন্য আমার জোড়া এবং বা এর সংজ্ঞা দিতে সক্ষম হতে হবে যা আমি বিশ্বাস করি পণ্য এবং যোগফলের ধরণগুলি।

দেখে মনে হচ্ছে যে আমি জোড়গুলি এইভাবে সংজ্ঞায়িত করতে পারি:

pair = λabf.fab
first = λp.p(λab.a)
second = λp.p(λab.b)

যেহেতু pairটাইপটি হবে a -> (b -> ((a -> (b -> x)) -> x)), পাস করার পরে বলুন, একটি intএবং এ string, এটি টাইপের সাথে এমন কিছু উপার্জন করতে (int -> (string -> x)) -> xপারে যা একটি জোড় intএবং এর উপস্থাপনা হবে string। এখানে আমাকে বিরক্ত করার বিষয়টি হ'ল এটি যদি কোনও জুটির প্রতিনিধিত্ব করে তবে কেন এটি যুক্তিযুক্তভাবে সমান নয়, বা প্রস্তাবটির বোঝাও নয় int and string? তবে, এর সমতুল্য (((int and string) -> x) -> x), যদি আমি কেবল ফাংশনের পরামিতি হিসাবে পণ্য ধরণের থাকতে পারি। এই উত্তরএই সমস্যাটির সমাধান করেছেন বলে মনে হয় তবে তিনি যে চিহ্নগুলি ব্যবহার করেন তার অর্থ কী তা আমার কোনও ধারণা নেই। এছাড়াও, যদি এটি সত্যিই কোনও পণ্যের ধরণকে এনকোড করে না, তবে উপরের জোড়াগুলির আমার সংজ্ঞাটি (আমি এন-টিপলসকে একইভাবে সংজ্ঞা দিতে পারি) বিবেচনা করে পণ্য প্রকারের সাথে আমি কী করতে পারি? যদি তা না হয়, তবে কি এই সত্যটির বিরোধিতা করবে না যে আপনি কেবল ছদ্মবেশ ব্যবহার করে (এএফআইকে) সংমিশ্রণটি প্রকাশ করতে পারবেন না?

এছাড়াও, যোগফলের প্রকারটি কেমন? আমি কি কেবলমাত্র ফাংশন প্রকারটি ব্যবহার করে এটিকে এনকোড করতে পারি? যদি তাই হয় তবে এটি তালিকা সংজ্ঞায়িত করার পক্ষে যথেষ্ট হবে? অথবা অন্যথায়, আমার টাইপ সিস্টেমটি প্রসারিত না করে তালিকাগুলি সংজ্ঞায়নের কোনও অন্য উপায় আছে? এবং যদি না হয়, আমি এটি যথাসম্ভব সহজ রাখতে চাইলে আমার কী পরিবর্তন করা দরকার?

দয়া করে মনে রাখবেন যে আমি একজন কম্পিউটার প্রোগ্রামার কিন্তু কম্পিউটার বিজ্ঞানী বা গণিতবিদ নই এবং গণিতের স্বরলিপি পড়তে খুব খারাপ।

সম্পাদনা: আমি নিশ্চিত নই যে আমি এখনও অবধি যা প্রয়োগ করেছি তার প্রযুক্তিগত নাম কী, তবে আমার কাছে যা আছে তা মূলত আমি উপরে লিঙ্ক করেছি, এটি একটি সীমাবদ্ধ প্রজন্মের অ্যালগরিদম যা প্রয়োগগুলি, বিমূর্তি এবং ভেরিয়েবলগুলির নিয়ম ব্যবহার করে হিনলে-মিলনার অ্যালগরিদম থেকে এবং তারপরে একটি একীকরণ অ্যালগরিদম যা মূল প্রকারটি পায়। উদাহরণস্বরূপ, অভিব্যক্তিটি \a.aপ্রকারটি দেবে a -> a, এবং অভিব্যক্তিটি \a.(a a)ঘটে যাওয়া চেক ত্রুটিটি ছুঁড়ে দেবে। সর্বোপরি, ঠিক কোনও letনিয়ম নেই তবে এমন একটি ফাংশন যা একই প্রভাব বলে মনে হচ্ছে যা আপনাকে এই সিডো কোডের মতো পুনরাবৃত্ত বিশ্বব্যাপী ফাংশনগুলি সংজ্ঞায়িত করতে দেয়:

GetTypeOfGlobalFunction(term, globalScope, nameOfFunction)
{
    // Here 'globalScope' contains a list of name-value pair where every value is of class 'ClosedType', 
    // meaning their type will be cloned before unified in the unification algorithm so that they can be used polymorphically 
    tempType = new TypeVariable() // Assign a dummy type to `tempType`, say, type 'x'.
    // The next line creates an scope with everything in 'globalScope' plus the 'nameOfFunction = tempType' name-value pair
    tempScope = new Scope(globalScope, nameOfFunction, tempType) 
    type = TypeOfTerm(term, tempScope) // Calculate the type of the term 
    Unify(tempType, type)
    return type
    // After returning, the code outside will create a 'ClosedType' using the returned type and add it to the global scope.
}

কোডটি মূলত এই শব্দটির ধরনটি যথারীতি পায় তবে একত্রিত হওয়ার আগে এটি ফাংশনের নামটি একটি ডামি টাইপের সাথে টাইপ স্কোপের সাথে সংজ্ঞায়িত করা হয় যাতে এটি নিজের মধ্যে থেকেই পুনরাবৃত্তভাবে ব্যবহার করা যায়।

সম্পাদনা 2: আমি কেবল বুঝতে পেরেছি যে আমার চাইলে একটি তালিকা সংজ্ঞায়িত করার জন্য আমারও পুনরাবৃত্ত প্রকারের প্রয়োজন হবে যা আমার নেই।


আপনি ঠিক কী বাস্তবায়ন করেছেন সে সম্পর্কে আপনি কি আরও কিছু নির্দিষ্ট হতে পারেন? আপনি কি সরল টাইপড ল্যাম্বডা ক্যালকুলাস (পুনরাবৃত্ত সংজ্ঞা সহ) প্রয়োগ করেছেন এবং এটিকে প্যারামেট্রিক পলিমারফিজমগুলি হিন্ডলি-মিলনার স্টাইল দিয়েছেন? বা আপনি দ্বিতীয়-অর্ডার পলিমারফিক ল্যাম্বডা ক্যালকুলাস প্রয়োগ করেছেন?
আন্দ্রেজ বাউয়ার

হতে পারে আমি আরও সহজ উপায়ে জিজ্ঞাসা করতে পারি: আমি যদি ওসিএএমএল বা এসএমএল গ্রহণ করি এবং এটি খাঁটি ল্যাম্বডা শর্তাদি এবং পুনরাবৃত্ত সংজ্ঞাগুলিতে সীমাবদ্ধ রাখি তবে আপনি কি সেই বিষয়ে কথা বলছেন?
আন্দ্রেজ বাউয়ার

@ আন্দ্রেজবাউর: আমি প্রশ্নটি সম্পাদনা করেছি। আমি ওসিএএমএল এবং এসএমএল সম্পর্কে নিশ্চিত নই, তবে আমি অবশ্যই নিশ্চিত যে আপনি যদি হাস্কেলকে নিয়ে যান এবং এটি ল্যাম্বডা শর্তে সীমাবদ্ধ করেন এবং শীর্ষ স্তরের পুনরাবৃত্তিযোগ্য (যেমন let func = \x -> (func x)) আপনি আমার কাছে যা পান তা পেতে পারেন।
জুয়ান

1
আপনার প্রশ্নের উন্নতির জন্য, এই মেটা পোস্টটি চেকআউট করুন
জুহো

উত্তর:


13

জোড়া

এই এনকোডিংটি হল জোড়গুলির চার্চ এনকোডিং । অনুরূপ কৌশলগুলি বুলিয়ান, পূর্ণসংখ্যা, তালিকা এবং অন্যান্য ডেটা স্ট্রাকচারকে এনকোড করতে পারে।

প্রসঙ্গে x:a; y:b, শব্দটির pair x yধরন রয়েছে (a -> b -> t) -> t। এই ধরনের যৌক্তিক ব্যাখ্যা নিম্নলিখিত সূত্র (আমি মান গাণিতিক স্বরলিপি ব্যবহার করুন: ইঙ্গিত হয়, বা, এবং, হয় অস্বীকৃতি; সূত্রের সমানতা হয়): কেন “ এবং বা ”? স্বজ্ঞাতভাবে, কারণ¬¬

(abt)t¬(¬a¬bt)t(ab¬t)t(ab)t
ab tpairএকটি ফাংশন যা যুক্তি হিসাবে একটি ফাংশন নেয় এবং এটি জোড়ায় প্রয়োগ করে। এটি যেতে পারে এমন দুটি উপায় রয়েছে: যুক্তি ফাংশনটি জোড়টি ব্যবহার করতে পারে বা tজোড়াটি ব্যবহার না করে এটি কোনও ধরণের মান তৈরি করতে পারে ।

pairজোড় টাইপের জন্য নির্মাতা firstএবং secondএটি ডেস্ট্রাক্টর। (এই একই শব্দগুলি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে ব্যবহৃত হয়; এখানে শব্দগুলির একটি অর্থ রয়েছে যা আমি এখানে যাব না এমন ধরণের এবং পদগুলির যৌক্তিক ব্যাখ্যার সাথে সম্পর্কিত ।) স্বজ্ঞাতভাবে, ধ্বংসকারীরা আপনাকে যা অ্যাক্সেস করতে দেয় অবজেক্টে এবং কনস্ট্রাক্টররা আর্গুমেন্ট হিসাবে একটি ফাংশন গ্রহণ করে যা তারা বস্তুর অংশগুলিতে প্রয়োগ করে ডিস্ট্রাক্টরের পক্ষে পথ প্রশস্ত করে। এই নীতিটি অন্য ধরণের ক্ষেত্রেও প্রয়োগ করা যেতে পারে।

অঙ্কের

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

let case w = λf. λg. w f g           case : ((a->t) -> (b->t) -> t) -> (a->t) -> (b->t) -> t
  (* or simply let case w = w *)
let left x = λf. λg. f x             left : a -> ((a->t) -> (b->t) -> t)
let right y = λf. λg. g x            right : b -> ((a->t) -> (b->t) -> t)

আমাকে টাইপ সংক্ষিপ্ত যাক (a->t) -> (b->t) -> tযেমন SUM(a,b)(t)। তারপরে ধ্বংসকারী এবং নির্মাণকারীদের ধরণগুলি হ'ল:

case : SUM(a,b)(t) -> (a->t) -> (b->t) -> t
left : a -> SUM(a,b)(t)
right : b -> SUM(a,b)(t)

এইভাবে

case (left x) f g → f x
case (rightt y) f g → g y

তালিকাসমূহ

একটি তালিকার জন্য, আবার একই নীতি প্রয়োগ করুন। একটি তালিকা যার উপাদানগুলির টাইপ রয়েছে aতা দুটি উপায়ে তৈরি করা যেতে পারে: এটি একটি খালি তালিকা হতে পারে, বা এটি একটি উপাদান (মাথা) পাশাপাশি একটি তালিকা (পুচ্ছ) হতে পারে। জোড়গুলির সাথে তুলনা করে, ডাস্ট্রেক্টরগুলির ক্ষেত্রে এটি একটি সামান্য বাঁক রয়েছে: আপনার দুটি পৃথক ডেস্ট্রাক্টর থাকতে পারে না headএবং tailকারণ তারা কেবল খালি খালি তালিকায় কাজ করবে। আপনার একটি সিগন ডেস্ট্রাক্টর দরকার আছে, যার সাথে দুটি যুক্তি রয়েছে যার একটি শূন্য মামলার জন্য একটি 0-আর্গুমেন্ট ফাংশন (অর্থাত্ একটি মান), এবং অন্যটি কনস কেসের জন্য 2-তর্ক ফাংশন। কার্যাবলী পছন্দ is_empty, headএবং tailযে থেকে আহরিত হতে পারে। অঙ্কের ক্ষেত্রে, তালিকাটি সরাসরি তার নিজস্ব ডেস্ট্রাক্টর ফাংশন।

let nil = λn. λc. n
let cons h t = λn. λc. c h t
let is_empty l = l true (λh. λt. false) 
let head l default = l default (λh. λt. h)
let tail l default = l default (λh. λt. t)

এই ফাংশনগুলির প্রতিটি পলিমারফিক হয়। আপনি যদি এই ফাংশনগুলির ধরণের কাজ করেন তবে আপনি লক্ষ করুন যে consঅভিন্ন নয়: ফলাফলের ধরণটি আর্গুমেন্টের ধরণের মতো নয়। ফলাফলের ধরণটি একটি পরিবর্তনশীল - এটি আর্গুমেন্টের চেয়ে বেশি সাধারণ। আপনি যদি চেইন consকল consকরেন তবে বিভিন্ন ধরণের তালিকা ইনস্ট্যানিয়েট তৈরি করার জন্য ক্রমাগত কলগুলি । পুনরাবৃত্তির ধরণের অভাবে তালিকাগুলি কাজ করা গুরুত্বপূর্ণ to আপনি যেভাবে ভিন্ন ভিন্ন তালিকা তৈরি করতে পারেন। প্রকৃতপক্ষে, আপনি যে ধরণের প্রকাশ করতে পারেন তা " তালিকার তালিকা " নয়, তবে "তালিকা তৈরি করুন যার প্রথম উপাদানগুলি - , " প্রকারের ।টি 1 , , টি এনTT1,,Tn

আপনি যেমন লক্ষ্য করেন, আপনি যদি এমন কোনও ধরণের সংজ্ঞা দিতে চান যা কেবলমাত্র একজাতীয় তালিকাগুলি রাখে, আপনার পুনরাবৃত্ত প্রকারের প্রয়োজন। কেন? আসুন তালিকার ধরণটি দেখুন। একটি তালিকা একটি ক্রিয়াকলাপ হিসাবে এনকোড করা হয় যা দুটি আর্গুমেন্ট গ্রহণ করে: খালি তালিকায় ফিরে আসার মান এবং একটি কনস সেলটিতে মানটি গণনা করার জন্য ফাংশন। দিন aউপাদান টাইপ হও, bতালিকার ধরনের হতে, এবং cটাইপ বিনাশকারী দ্বারা ফিরে হবে। তালিকার ধরণ

a -> (a -> b -> c) -> c

তালিকাটি সর্বনিম্ন করে বলছে এটি যদি কনস কোষ হয় তবে লেজটির পুরোটির মতো একই ধরণের থাকতে হবে, অর্থাৎ এটি বাধা যুক্ত করে

a -> (a -> b -> c) -> c = b

হিন্ডলে-মিলনার টাইপ সিস্টেমটি এ জাতীয় পুনরাবৃত্ত প্রকারের সাহায্যে প্রসারিত করা যেতে পারে এবং বাস্তবে বাস্তব প্রোগ্রামিং ভাষাগুলি এটি করে। ব্যবহারিক প্রোগ্রামিং ভাষাগুলি এ জাতীয় "নগ্ন" সমীকরণগুলি অস্বীকার করে এবং একটি ডেটা কনস্ট্রাক্টরের প্রয়োজন, তবে এটি অন্তর্নিহিত তত্ত্বের অভ্যন্তরীণ প্রয়োজনীয়তা নয়। একটি ডেটা কনস্ট্রাক্টরের প্রয়োজন প্রকারের অনুক্রমকে সহজ করে তোলে এবং অনুশীলনে বাস্তবে বগী এমন ফাংশনগুলি গ্রহণ করা এড়ানো যায় তবে কিছু অনর্থক সীমাবদ্ধতার সাথে টাইপযোগ্য হয় যা ফাংশনটি ব্যবহৃত হয় যেখানে বোঝার জন্য বোঝা শক্ত টাইপের ত্রুটির কারণ হয়। এ কারণেই, উদাহরণস্বরূপ, ওক্যামেল কেবল অ-ডিফল্ট -rectypesসংকলক বিকল্পের সাহায্যে অনার্সিত পুনরাবৃত্ত প্রকারগুলি গ্রহণ করে । ওসিএএমএল সিনট্যাক্সের উপরের সংজ্ঞাগুলি এখানে, একসাথে তালিকার জন্য স্বতন্ত্র তালিকাগুলির জন্য টাইপ সংজ্ঞা সহঅ্যালাইজড রিকার্সিভ টাইপস : এর type_expression as 'aঅর্থ type_expressionহ'ল টাইপটি ভেরিয়েবলের সাথে একত্রিত 'a

# let nil = fun n c -> n;;
val nil : 'a -> 'b -> 'a = <fun>
# let cons h t = fun n c -> c h t;;
val cons : 'a -> 'b -> 'c -> ('a -> 'b -> 'd) -> 'd = <fun>
# let is_empty l = l true (fun h t -> false);;
val is_empty : (bool -> ('a -> 'b -> bool) -> 'c) -> 'c = <fun>
# let head l default = l default (fun h t -> h);;
val head : ('a -> ('b -> 'c -> 'b) -> 'd) -> 'a -> 'd = <fun>
# let tail l default = l default (fun h t -> t);;
val tail : ('a -> ('b -> 'c -> 'c) -> 'd) -> 'a -> 'd = <fun>
# type ('a, 'b, 'c) ulist = 'c -> ('a -> 'b -> 'c) -> 'c;;
type ('a, 'b, 'c) ulist = 'c -> ('a -> 'b -> 'c) -> 'c
# is_empty (cons 1 nil);;
- : bool = false
# head (cons 1 nil) 0;;
- : int = 1
# head (tail (cons 1 (cons 2.0 nil)) nil) 0.;;
- : float = 2.

(* -rectypes is required for what follows *)
# type ('a, 'b, 'c) rlist = 'c -> ('a -> 'b -> 'c) -> 'c as 'b;;
type ('a, 'b, 'c) rlist = 'b constraint 'b = 'c -> ('a -> 'b -> 'c) -> 'c
# let rcons = (cons : 'a -> ('a, 'b, 'c) rlist -> ('a, 'b, 'c) rlist);;
val rcons :
  'a ->
  ('a, 'c -> ('a -> 'b -> 'c) -> 'c as 'b, 'c) rlist -> ('a, 'b, 'c) rlist =
  <fun>
# head (rcons 1 (rcons 2 nil)) 0;;
- : int = 1
# tail (rcons 1 (rcons 2 nil)) nil;;
- : 'a -> (int -> 'a -> 'a) -> 'a as 'a = <fun>
# rcons 1 (rcons 2.0 nil);;
Error: This expression has type
         (float, 'b -> (float -> 'a -> 'b) -> 'b as 'a, 'b) rlist = 'a
       but an expression was expected of type
         (int, 'b -> (int -> 'c -> 'b) -> 'b as 'c, 'b) rlist = 'c

folds

আরও কিছুটা সাধারণভাবে এটিকে দেখলে, ডাটা স্ট্রাকচারের প্রতিনিধিত্ব করে এমন ফাংশনটি কী?

  • একটি প্রাকৃতিক সংখ্যার জন্য: ফাংশন হিসাবে প্রতিনিধিত্ব করা হয় যা তার যুক্তিকে বার করে দেয়।এনnn
  • একটি জোড়ার জন্য: এমন একটি ফাংশন হিসাবে উপস্থাপিত হয় যা এর যুক্তিটি এবং প্রয়োগ করে ।x y(x,y)xy
  • একটি অঙ্কের জন্য: th এ th একটি ফাংশন হিসাবে উপস্থাপিত হয় যা এটির এর ম যুক্তিকে প্রয়োগ করে ।ixini(x)ix
  • একটি তালিকার জন্য: এমন একটি ফাংশন হিসাবে প্রতিনিধিত্ব করা হয় যা দুটি আর্গুমেন্ট নেয়, খালি তালিকার জন্য ফিরে আসার মান এবং কনস কোষগুলিতে প্রয়োগ করার জন্য ফাংশন।[x1,,xn]

সাধারণ পরিভাষায়, ডেটা স্ট্রাকচারটি তার ভাঁজ ফাংশন হিসাবে উপস্থাপিত হয় । এটি ডেটা স্ট্রাকচারের জন্য একটি সাধারণ ধারণা: একটি ভাঁজ ফাংশন হ'ল অর্ডার ফাংশন যা ডেটা স্ট্রাকচারকে অতিক্রম করে। এখানে একটি প্রযুক্তিগত ধারণা রয়েছে যা ভাঁজ সর্বজনীন : সমস্ত "জেনেরিক" ডেটা স্ট্রাকচার ট্রভারসালগুলি ভাঁজের ক্ষেত্রে প্রকাশ করা যেতে পারে। যেহেতু ডেটা স্ট্রাকচারটি তার ভাঁজ ফাংশনটি এটির হিসাবে উপস্থাপিত হতে পারে: কোনও ডেটা স্ট্রাকচার সম্পর্কে আপনাকে যা জানা দরকার তা হল এটি কীভাবে ট্র্যাভার করা যায়, বাকিটি একটি বাস্তবায়ন বিশদ।


আপনি পূর্ণসংখ্যা, জোড়া, যোগফলগুলির " চার্চ এনকোডিং" উল্লেখ করেছেন তবে তালিকার জন্য আপনি স্কটকে এনকোডিং দিয়েছেন give আমি মনে করি যারা এন্ডাকটিভ টাইপের এনকোডিংগুলির সাথে পরিচিত নন তাদের জন্য এটি কিছুটা বিভ্রান্তিকর হতে পারে।
স্টাফেন গিমেনেজ

সুতরাং মূলত, আমার জোড়ের ধরণটি আসলে কোনও পণ্যের ধরণের নয় কারণ এই ধরণের কোনও ফাংশন কেবল ফিরে আসতে পারে tএবং যে যুক্তিটি গ্রহণ করা হবে তা উপেক্ষা করতে পারে aএবং b(যা ঠিক (a and b) or tতাই বলছে)। এবং মনে হয় আমি বীজের সাথে একই ধরণের ঝামেলা করতাম। এবং এছাড়াও, পুনরাবৃত্তির ধরন ছাড়াই আমার একজাতীয় তালিকা থাকবে না। সুতরাং কয়েকটি কথায়, আপনি কি বলছেন যে সমজাতীয় তালিকা পেতে আমার যোগফল, পণ্য এবং পুনরাবৃত্তির ধরণের নিয়ম যুক্ত করা উচিত?
জুয়ান

আপনি কি case (right y) f g → g yনিজের সমষ্টি বিভাগের শেষে বলতে চেয়েছিলেন ?
জুয়ান

@ স্টাফেনগিমেনিজ আমি বুঝতে পারি নি আমি টাইপ করা বিশ্বে এই এনকোডিংগুলিতে কাজ করতে অভ্যস্ত নই। আপনি কি চার্চ এনকোডিং বনাম স্কট এনকোডিংয়ের জন্য একটি উল্লেখ দিতে পারেন?
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

@ জুয়ানলুইস সোল্ডি আপনি সম্ভবত শুনেছেন যে "কোনও সমস্যা নেই যা অতিরিক্ত স্তরের ইন্ডিয়ারেশন দিয়ে সমাধান করা যায় না"। চার্চ এনকোডিংগুলি ফাংশন কলের স্তরকে যুক্ত করে ফাংশন হিসাবে ডেটা স্ট্রাকচারগুলিকে এনকোড করে: একটি ডাটা স্ট্রাকচারটি সেকেন্ড-অর্ডার ফাংশনে পরিণত হয় যা আপনি অংশগুলিতে কাজ করতে ফাংশনে প্রয়োগ করেন। আপনি যদি একজাতীয় তালিকার ধরণ চান তবে আপনাকে লেজের ধরণটি পুরো তালিকার ধরণের সমতুল্য এই বিষয়টি নিয়ে কাজ করতে হবে। আমি মনে করি এটির মধ্যে একধরণের পুনরাবৃত্তি থাকতে হবে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

2

আপনি ট্যাগ এবং মান সহ পণ্যের ধরণ হিসাবে যোগফলের প্রতিনিধিত্ব করতে পারেন। এই ক্ষেত্রে, আমরা কিছুটা ঠকাই এবং একটি ট্যাগ ব্যবহার করতে পারি শূন্য বা না করার জন্য, দ্বিতীয় ট্যাগটি হেড / টেল জোড়ের প্রতিনিধিত্ব করে।

আমরা বুলিয়ানগুলি স্বাভাবিক উপায়ে সংজ্ঞায়িত করি:

true = λi.λe.i
false = λi.λe.e
if = λcond.λthen.λelse.(cond then else)

তারপরে একটি তালিকা বুলিয়ান হিসাবে প্রথম উপাদান এবং দ্বিতীয় / মাথা / পুচ্ছ জোড়া হিসাবে দ্বিতীয় উপাদান pair কিছু বুনিয়াদি তালিকা ফাংশন:

isNull = λl.(first l)
null = pair false false     --The second element doesn't matter in this case
cons = λh.λt.(pair true (pair h t ))
head = λl.(fst (snd l))   --This is a partial function
tail = λl.(snd (snd l))   --This is a partial function  

map = λf.λl.(if (isNull l)
                 null 
                 (cons (f (head l)) (map f (tail l) ) ) 

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