ফাংশন প্যারামিটার ধরণ হিসাবে নীচের ধরণের জন্য কোনও ব্যবহারের কেস আছে?


12

যদি কোনও ফাংশনে রিটার্ন টাইপ ⊥ ( নীচের প্রকার ) থাকে, তার অর্থ এটি কখনই ফিরে আসে না। এটি উদাহরণস্বরূপ প্রস্থান বা নিক্ষেপ করতে পারে, উভয়ই মোটামুটি সাধারণ পরিস্থিতি।

সম্ভবত যদি কোনও ফাংশনটির টাইপগুলির একটি প্যারামিটার থাকে ⊥ তবে এটি কখনই (নিরাপদে) বলা যায় না। এই ধরনের ফাংশন সংজ্ঞায়িত করার কোনও কারণ আছে কি?

উত্তর:


17

বা খালি টাইপের নির্ধারিত বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল প্রতিটি প্রকার জন্য ফাংশন exists রয়েছে । আসলে, এখানে একটি অনন্য বৈশিষ্ট্য রয়েছে function সুতরাং, স্ট্যান্ডার্ড লাইব্রেরির অংশ হিসাবে এই ফাংশনটি সরবরাহ করা মোটামুটি যুক্তিসঙ্গত। প্রায়শই এ জাতীয় কিছু বলা হয় । (সাব টাইপ সহ সিস্টেমগুলিতে, এটি হ'ল type প্রতিটি প্রকারের একটি উপ-প্রকার হ'ল সহজেই পরিচালনা করা যায় Then তারপরে অন্তর্নিহিত রূপান্তরটি হিসাবে সংজ্ঞায়িত করা হয় যা আলফাকে সহজভাবে ইনস্ট্যান্ট করা যায় which যেকোন প্রকারের.)একজনএকজনabsurdabsurd α.α

আপনি অবশ্যই এই জাতীয় কোনও ক্রিয়াকলাপ বা সমতুল্য থাকতে চান কারণ এটিই আপনাকে functions উত্পাদনকারী ফাংশনগুলির ব্যবহার করতে দেয় । উদাহরণস্বরূপ, ধরা যাক আমাকে একটি যোগফল । আমি এটিতে একটি কেস বিশ্লেষণ করি এবং ক্ষেত্রে আমি ব্যবহার করে একটি ব্যতিক্রম ছুঁড়তে চলেছি । ইন মামলা, আমি ব্যবহার করব । সামগ্রিকভাবে, আমি টাইপ মান চাই তাই আমার একটি একটি পরিণত করার জন্য কিছু করা দরকার । এটাই আমাকে করতে দেয়।E+AEthrow:EAf:ABBBabsurd

এটি বলেছিল, আপনার নিজের functions of এর নিজস্ব কার্যকারিতা সংজ্ঞায়িত করার পুরো কারণ নেই । সংজ্ঞা দ্বারা, তারা অগত্যা উদাহরণ হতে হবে । তবুও, আপনি স্ট্যান্ডার্ড লাইব্রেরি সরবরাহ না করা থাকলে এটি করতে পারেন , বা আপনি টাইপ চেকিং / ইনফারেন্সকে সহায়তা করতে কোনও টাইপ বিশেষায়িত সংস্করণ চেয়েছিলেন। তবে, সহজে ফাংশন যে শেষ হবে তৈরী করতে পারে instantiated মত একটি টাইপ ।AabsurdabsurdA

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


সুতরাং এর অর্থ (x ? 3 : throw new Exception())বিশ্লেষণের উদ্দেশ্যে এমন কিছুর মতো আরও কিছু দিয়ে প্রতিস্থাপন করা হয় (x ? 3 : absurd(throw new Exception()))?
বিডিএসএল

আপনি subtyping বা সংজ্ঞায়িত ছিল না না করে থাকেন তাহলে যেমন α এবং , তারপরে প্রাক্তনটি চেক টাইপ করবে না এবং পরবর্তীটি করবে। সাব টাইপিংয়ের সাহায্যে হ্যাঁ, এর মতো কিছু অন্তর্ভুক্ত রয়েছে। অবশ্যই, আপনি করা হতে পারে সংজ্ঞা ভেতরে যা কার্যকরভাবে কি সংজ্ঞায়িত হয় যেমন α α করতে হবে। α.αabsurdabsurdthrowα.α
ডেরেক এলকিনস SE

6

ফাংশনটি সম্পর্কে যা বলা হয়েছে তার সাথে যুক্ত করার জন্য absurd: ⊥ -> aআমার এই কার্যকারিতাটি আসলে কীভাবে কার্যকর তা তার একটি দৃ concrete় উদাহরণ রয়েছে।

হ্যাস্কেল ডেটা-টাইপ বিবেচনা করুন Free f aযা fআকারের নোড এবং পাতা সম্বলিত একটি সাধারণ গাছের কাঠামোর প্রতিনিধিত্ব করে a:

data Free f a = Op (f (Free f a)) | Var a

এই গাছগুলি নিম্নলিখিত ফাংশন দিয়ে ভাঁজ করা যেতে পারে:

fold :: Functor f => (a -> b) -> (f b -> b) -> Free f a -> b
fold gen alg (Var x) = gen x
fold gen alg (Op x) = alg (fmap (fold gen alg) x)

সংক্ষেপে, এই অপারেশনটি algনোড এবং genপাতায় স্থান দেয়।

এখন বিন্দু: সমস্ত পুনরাবৃত্তির ডেটাস্ট্রাকচারগুলি একটি স্থির-পয়েন্ট ডেটাটাইপ ব্যবহার করে উপস্থাপন করা যেতে পারে। হাস্কেলের মধ্যে এটি রয়েছে Fix fএবং এটি সংজ্ঞায়িত করতে পারে type Fix f = Free f ⊥(অর্থাত্ fআকারের নোডযুক্ত গাছ এবং ফান্টারের বাইরে কোনও পাতা নেই f)। Ditionতিহ্যগতভাবে এই কাঠামোর একটি ভাঁজও রয়েছে, যাকে বলে cata:

cata :: Functor f => (f a -> a) -> Fix f -> a
cata alg x = fold absurd alg x

যা অযৌক্তিকর বেশ ঝরঝরে ব্যবহার দেয়: যেহেতু গাছের কোনও পাতা থাকতে পারে না (যেহেতু than ছাড়া অন্য কোনও বাসিন্দা নেই undefined), তাই genএই ভাঁজটির জন্য এটি কখনও ব্যবহার করা সম্ভব নয় এবং এটি absurdচিত্রিত করে!


2

নীচের ধরণটি প্রতিটি অন্যান্য ধরণের একটি উপ-প্রকার যা অনুশীলনে অত্যন্ত কার্যকর হতে পারে। উদাহরণস্বরূপ, NULLসি এর তাত্ত্বিক টাইপ-নিরাপদ সংস্করণে প্রকারটি অবশ্যই প্রতিটি অন্যান্য পয়েন্টার ধরণের একটি উপপ্রকার হতে হবে, অন্যথায় আপনি যেমন প্রত্যাশিত NULLযেখানে ফিরে যেতে পারেন না char*; তেমনি, undefinedতাত্ত্বিক প্রকারের-নিরাপদ জাভাস্ক্রিপ্টের ধরণটি অবশ্যই ভাষার অন্য প্রতিটি ধরণের একটি উপপ্রকার হতে হবে।

exit()throw()IntIntexit()

টিএসটি


3
NULLএকটি ইউনিট টাইপ হয় না, খালি টাইপ from যা থেকে পৃথক?
বিডিএসএল

টাইপ থিওরি বলতে কী বোঝায় তা আমি নিশ্চিত নই।
বিডিএসএল

1
@ বিডিএসএল এখানে বাঁকা অপারেটর "এর একটি উপপ্রকার"; আমি নিশ্চিত নই যে এটি স্ট্যান্ডার্ড কিনা, আমার প্রফেসর এটিই ব্যবহার করেছিলেন।
ড্রাকোনিস

1
@ gnasher729 সত্য, তবে সিও বিশেষত টাইপ-নিরাপদ নয়। আমি বলছি যদি আপনি কেবল একটি পূর্ণসংখ্যা কাস্ট করতে না পারেন তবে আপনার void*এটির জন্য নির্দিষ্ট ধরণের প্রয়োজন যা কোনও পয়েন্টার টাইপের জন্য ব্যবহার করা যেতে পারে।
ড্রাকোনিস


2

আমি ভাবতে পারি এমন একটি ব্যবহার রয়েছে এবং এটি এমন একটি বিষয় যা সুইফ্ট প্রোগ্রামিং ভাষার উন্নতি হিসাবে বিবেচিত হয়েছে।

সুইফ্টের একটি maybeমোনাড, বানান Optional<T>বা T?। এটির সাথে ইন্টারঅ্যাক্ট করার অনেকগুলি উপায় রয়েছে।

  • আপনি শর্তসাপেক্ষ আনআরপিংয়ের মতো ব্যবহার করতে পারেন

    if let nonOptional = someOptional {
        print(nonOptional)
    }
    else {
        print("someOptional was nil")
    }
    
  • আপনি ব্যবহার করতে পারেন map, flatMapমান রুপান্তর

  • বাধ্যতামূলকভাবে বিষয়বস্তু মোড়ক মোছার জন্য অপারেটর ( !, প্রকারের (T?) -> T) জোর করে মোছা, অন্যথায় ক্রাশটি ট্রিগার করে
  • নীল-কোয়েলসিং অপারেটর ( ??, প্রকারের (T?, T) -> T) এর মান নিতে বা অন্যথায় একটি ডিফল্ট মান ব্যবহার করতে:

    let someI = Optional(100)
    print(someI ?? 123) => 100 // "left operand is non-nil, unwrap it.
    
    let noneI: Int? = nil
    print(noneI ?? 123) // => 123 // left operand is nil, take right operand, acts like a "default" value
    

দুর্ভাগ্যক্রমে, "মোড়ানো বা একটি ত্রুটি নিক্ষেপ" বা "কাস্টম ত্রুটি বার্তার সাথে মোড়ক বা ক্রাশ" বলার কোনও সংক্ষিপ্ত উপায় ছিল না। কিছুটা এইরকম

let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")

সংকলন করে না, কারণ fatalErrorটাইপ আছে () -> Never( ()হ'ল Voidসুইফটের ইউনিট টাইপ, Neverসুইফটের নীচের প্রকার)। এটির কলিং এটি উত্পাদন করে Never, যা Tডান সংক্ষেপণের হিসাবে প্রত্যাশার সাথে উপযুক্ত নয় ??

এটিরSE-0217 প্রতিকারের প্রয়াসে, সুইফ্ট বিবর্তনের প্রস্তাব - " আনপ্রেপ বা ডাই" অপারেটরটি রাখা হয়েছিল। এটি চূড়ান্তভাবে প্রত্যাখ্যান করা হয়েছিল , তবে এটি Neverসমস্ত ধরণের একটি উপপ্রকার হতে আগ্রহী করেছিল ।

যদি Neverসকল ধরণের উপপ্রকার হিসাবে তৈরি করা হয় তবে পূর্ববর্তী উদাহরণটি সংকলনযোগ্য হবে:

let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")

কারণ কল সাইটটিতে ??টাইপ রয়েছে (T?, Never) -> Tযা (T?, T) -> Tস্বাক্ষরের সাথে সামঞ্জস্যপূর্ণ ??


0

সুইফ্টের একটি টাইপ রয়েছে "নেভার" যা একেবারে নীচের ধরণের মতো বলে মনে হয়: ফাংশনটি ফিরিয়ে আনার জন্য ঘোষিত কখনই ফিরে আসতে পারে না, টাইপের প্যারামিটার সহ একটি ফাংশন কখনই বলা যায় না।

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

বিশদর জন্য আপনার সুইফট-বিবর্তন মেলিং তালিকার নতুন পোস্টগুলিতে নজর রাখা উচিত।


7
"দ্রুত-বিবর্তন মেলিং তালিকার নতুন পোস্টগুলি" খুব পরিষ্কার বা স্থিতিশীল উল্লেখ নয়। মেলিং তালিকার কোনও ওয়েব সংরক্ষণাগার নেই?
ডেরেক এলকিনস ২ SE
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.