ব্যতিক্রম ধরা বা ছোঁড়া কি অন্যথায় খাঁটি পদ্ধতিটিকে অপরিষ্কার করে?


27

নিম্নলিখিত কোডের উদাহরণগুলি আমার প্রশ্নের প্রসঙ্গ সরবরাহ করে।

রুম বর্গটি একটি প্রতিনিধি দিয়ে শুরু করা হয়। রুম বর্গের প্রথম প্রয়োগে, প্রতিনিধিদের বিরুদ্ধে কোনও প্রহরী নেই যা ব্যতিক্রম ছুঁড়ে ফেলে। এই ধরনের ব্যতিক্রমগুলি উত্তর সম্পত্তিতে বুদবুদ হবে, যেখানে প্রতিনিধিকে মূল্যায়ন করা হয় (দ্রষ্টব্য: মূল () পদ্ধতিটি দেখায় যে কীভাবে কোনও ক্লাস কোডে রুমের উদাহরণ ব্যবহার করা হয়):

public sealed class Room
{
    private readonly Func<Room> north;

    public Room(Func<Room> north)
    {
        this.north = north;
    }

    public Room North
    {
        get
        {
            return this.north();
        }
    }

    public static void Main(string[] args)
    {
        Func<Room> evilDelegate = () => { throw new Exception(); };

        var kitchen = new Room(north: evilDelegate);

        var room = kitchen.North; //<----this will throw

    }
}

উত্তর সম্পত্তিটি পড়ার পরিবর্তে আমি বস্তু তৈরিতে ব্যর্থ হয়েছি বলে আমি কন্সট্রাক্টরকে ব্যক্তিগত হিসাবে পরিবর্তন করি এবং তৈরি () নামে একটি স্থিতিশীল কারখানার পদ্ধতি প্রবর্তন করি। এই পদ্ধতিটি প্রতিনিধি দ্বারা নিক্ষিপ্ত ব্যতিক্রমটিকে ধরে এবং একটি অর্থবহ ব্যতিক্রম বার্তা সহ একটি মোড়কের ব্যতিক্রম ছুঁড়ে ফেলে:

public sealed class Room
{
    private readonly Func<Room> north;

    private Room(Func<Room> north)
    {
        this.north = north;
    }

    public Room North
    {
        get
        {
            return this.north();
        }
    }

    public static Room Create(Func<Room> north)
    {
        try
        {
            north?.Invoke();
        }
        catch (Exception e)
        {
            throw new Exception(
              message: "Initialized with an evil delegate!", innerException: e);
        }

        return new Room(north);
    }

    public static void Main(string[] args)
    {
        Func<Room> evilDelegate = () => { throw new Exception(); };

        var kitchen = Room.Create(north: evilDelegate); //<----this will throw

        var room = kitchen.North;
    }
}

ট্রাই-ক্যাচ ব্লক কি তৈরি () পদ্ধতিটিকে অপরিশোধিত করে?


1
ঘর তৈরির ফাংশনটির সুবিধা কী; যদি আপনি কোনও প্রতিনিধি ব্যবহার করেন তবে ক্লায়েন্টকে 'উত্তর' বলার আগে কেন ফোন করুন?
এসএইচ

1
@ এসএইচ যদি প্রতিনিধি কোনও ব্যতিক্রম ছুঁড়ে, আমি রুম অবজেক্টটি তৈরি করার পরে তা জানতে চাই। আমি চাই না যে ক্লায়েন্টটি ব্যবহারের ক্ষেত্রে ব্যতিক্রমটি সন্ধান করবে, বরং সৃষ্টির ভিত্তিতে। দুষ্ট প্রতিনিধিদের ফাঁস করার জন্য তৈরি পদ্ধতি হ'ল সঠিক জায়গা।
রক অ্যান্টনি জনসন

3
@ রক অ্যান্থনি জনসন, হ্যাঁ প্রতিনিধিটিকে মৃত্যুদণ্ড কার্যকর করার সময় আপনি প্রথমবারের মতো কাজ করতে পারেন বা দ্বিতীয় কলটিতে কোনও আলাদা ঘর ফিরে আসতে পারেন? ডেলিগেটকে ডেকে আনা কি পার্শ্ব প্রতিক্রিয়া হতে পারে?
এসএইচ

4
একটি ফাংশন যা অপরিষ্কার ফাংশন বলে তাকে অশুচি ফাংশন বলা হয়, সুতরাং প্রতিনিধি যদি অপবিত্র Createহয় তবে এটি একে কল করে।
ইদান আরে

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

উত্তর:


26

হ্যাঁ। এটি কার্যকরভাবে একটি অপবিত্র ফাংশন। এটি একটি পার্শ্ব-প্রতিক্রিয়া তৈরি করে: ফাংশনটি যে জায়গায় প্রত্যাশিত হবে সেই জায়গাটি বাদে প্রোগ্রামের সম্পাদনা অন্য কোথাও অব্যাহত রয়েছে।

এটিকে খাঁটি ফাংশন করতে, returnএকটি আসল অবজেক্ট যা ফাংশন থেকে প্রত্যাশিত মানকে আবদ্ধ করে এবং কোনও মান Maybeবা সম্ভাব্য ত্রুটির শর্ত যেমন একটি বস্তু বা ওয়ার্ক অবজেক্টের ইউনিটকে নির্দেশ করে।


16
মনে রাখবেন, "খাঁটি" একটি সংজ্ঞা মাত্র। আপনার যদি এমন কোনও ফাংশন দরকার হয় যা ছুড়ে দেয় তবে অন্য প্রতিটি উপায়ে এটি স্বচ্ছভাবে স্বচ্ছ হয়, তবে আপনি যা লিখেন তেমন।
রবার্ট হার্ভে

1
হ্যাশকেলে কমপক্ষে যে কোনও ফাংশন নিক্ষেপ করতে পারে তবে ধরতে আপনাকে আইওতে থাকতে হবে, একটি খাঁটি ফাংশন যা সাধারণত মাঝে মাঝে ফেলে দেয় আংশিক
জে কে।

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

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

3
@zzzzBov: আমি "খাঁটি" এর সত্যিকারের কঠোর সংজ্ঞাটিকে এত গুরুত্বপূর্ণ বলে বিবেচনা করি না। উপরে দ্বিতীয় মন্তব্য
রবার্ট হার্ভে

12

আচ্ছা, হ্যাঁ ... এবং না

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

{
    var ignoreThis = func(arg);
}

তাহলে funcপবিত্র, একটি অপটিমাইজার সিদ্ধান্ত নেন পারে যে func(arg)এটা ফলাফলের দিয়ে প্রতিস্থাপিত করা যেতে পারে। ফলাফল কী তা এটি এখনও জানে না, তবে এটি বলতে পারে যে এটি ব্যবহার হচ্ছে না - সুতরাং এটি কেবল এই বিবৃতিটি অনুমান করতে পারে এবং এটি মুছে ফেলতে পারে।

তবে যদি func(arg)ফেলে দিতে হয়, তবে এই বিবৃতিটি কিছু করে - এটি একটি ব্যতিক্রম ছুঁড়ে! সুতরাং অপ্টিমাইজার এটিকে সরাতে পারে না - ফাংশনটি কল হয় বা না আসে তা বিবেচ্য।

কিন্তু ...

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

বলা হচ্ছে যে...

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

সি # এর Errorজাভা (এবং অন্যান্য অনেক ভাষা) এর মতো ক্লাস থাকলে আমি একটি Errorপরিবর্তে একটি নিক্ষেপ করার পরামর্শ দিয়েছিলাম Exception। এটি ইঙ্গিত দেয় যে ফাংশনের ব্যবহারকারী কিছু ভুল করেছে (একটি ফাংশন যা ছুড়ে ফেলেছে), এবং এই জাতীয় জিনিসগুলি খাঁটি ফাংশনে অনুমোদিত in তবে সি # এর কোনও Errorশ্রেণি নেই এবং ব্যবহারের ত্রুটি ব্যতিক্রমগুলি থেকে প্রাপ্ত বলে মনে হচ্ছে Exception। আমার পরামর্শটি হ'ল একটি নিক্ষেপ করা ArgumentException, এটি পরিষ্কার করে ফাংশনটি একটি খারাপ যুক্তি দিয়ে ডাকা হয়েছিল।


* গণনামূলকভাবে কথা বলতে। নিষ্কলুষ পুনরাবৃত্তি ব্যবহার করে প্রয়োগ করা একটি ফিবোনাচি ফাংশনটি প্রচুর সংখ্যক সময় নিতে পারে এবং মেশিনের সংস্থানগুলি শেষ করে দিতে পারে তবে সীমিত সীমাহীন সময় এবং স্মৃতির সাথে ফাংশনটি সর্বদা একই মান ফিরে আসবে এবং এর পার্শ্ব-প্রতিক্রিয়া থাকবে না (বরাদ্দ ব্যতীত অন্য কোনও প্রভাব নেই) স্মৃতি এবং সেই স্মৃতি পরিবর্তন করে) - এটি এখনও খাঁটি হিসাবে বিবেচিত হয়।


1
+1 আপনার প্রস্তাবিত আর্গুমেন্ট ধারণার ব্যবহারের জন্য, এবং "তারা ক্যাশে হবে এই উদ্দেশ্য নিয়ে খাঁটি ফাংশন থেকে ব্যতিক্রম নিক্ষেপ" না করার জন্য আপনার পরামর্শের জন্য।
রক অ্যান্টনি জনসন

আপনার প্রথম যুক্তি ("... ..." অবধি) আমার কাছে মনেহয় নয়। ব্যতিক্রম ফাংশনের চুক্তির অংশ। আপনি, ধারণাগতভাবে কোনও ফাংশন পুনরায় লিখতে (value, exception) = func(arg)পারেন এবং একটি ব্যতিক্রম নিক্ষেপের সম্ভাবনা সরিয়ে ফেলতে পারেন (কিছু ভাষায় এবং কিছু ধরণের ব্যতিক্রমের জন্য আপনাকে সংজ্ঞা দিয়ে যুক্ত করতে বা রিটার্ন ভ্যালু হিসাবে একই তালিকা তৈরি করতে হবে)। এখন এটি পূর্বের মতো খাঁটি হবে (প্রদত্ত এটি সর্বদা ফিরে আসে তবে একই যুক্তি অনুসারে একটি ব্যতিক্রম ছোঁড়ে)। যদি আপনি এই ব্যাখ্যাটি ব্যবহার করেন তবে একটি ব্যতিক্রম ছোঁড়া কোনও পার্শ্ব প্রতিক্রিয়া নয়
AnoE

@ কোনটি যদি আপনি এইভাবে লিখতেন তবে funcআমি যে ব্লকটি দিয়েছি তা অপ্টিমাইজ করা যেতে পারে, কারণ স্ট্যাকটি আনডিংয়ের পরিবর্তে নিক্ষিপ্ত ব্যতিক্রমটি এনকোড করা হত ignoreThis, যা আমরা উপেক্ষা করি। এই ব্যতিক্রমগুলি থেকে পৃথক নয় যে স্ট্যাকটি উন্মুক্ত করে, রিটার্ন টাইপের মধ্যে এনকোড করা ব্যতিক্রম বিশুদ্ধতা লঙ্ঘন করে না - এবং এজন্য অনেকগুলি কার্যকরী ভাষা সেগুলি ব্যবহার করতে পছন্দ করে।
ইদান আরে

হুবহু ... আপনি এই কল্পিত রূপান্তর ব্যতিক্রম উপেক্ষা করবেন না। আমি অনুমান করি এটি শব্দার্থবিজ্ঞান / সংজ্ঞা সম্পর্কিত একটি বিষয়, আমি কেবল এটি উল্লেখ করতে চেয়েছিলাম যে ব্যতিক্রমগুলির অস্তিত্ব বা উপস্থিতি অগত্যা বিশুদ্ধতার সমস্ত ধারণা বাতিল করে না।
AnoE

1
@AnoE কিন্তু কোড আমি writted থাকেন হবে এই কাল্পনিক রূপান্তরের ব্যতিক্রম উপেক্ষা করি। func(arg)টিপলটি ফিরিয়ে দেবে (<junk>, TheException()), এবং ignoreThisএতে টিপল থাকবে (<junk>, TheException()), তবে যেহেতু আমরা কখনই ignoreThisব্যতিক্রমটি ব্যবহার করি না তা কোনও কিছুর উপর প্রভাব ফেলবে না।
ইদান আরে

1

একটি বিবেচনা হ'ল চেষ্টা - ক্যাচ ব্লকটি সমস্যা নয়। (উপরের প্রশ্নের আমার মন্তব্যের ভিত্তিতে)।

প্রধান সমস্যা হ'ল উত্তর সম্পত্তিটি আই / ও কল

কোডটির প্রয়োগের এই মুহুর্তে, প্রোগ্রামটির ক্লায়েন্ট কোড দ্বারা সরবরাহ করা I / O পরীক্ষা করা দরকার। (এটি প্রাসঙ্গিক হবে না যে ইনপুটটি কোনও প্রতিনিধি আকারে আছে বা ইনপুটটি নামমাত্র হিসাবে ইতিমধ্যে পাস হয়েছিল)।

আপনি একবার ইনপুট নিয়ন্ত্রণ হারিয়ে ফেললে, আপনি নিশ্চিত করতে পারবেন না যে কার্যটি খাঁটি। (বিশেষত যদি ফাংশন নিক্ষেপ করতে পারে)।


আপনি কেন মুভি [চেক] রুমে কল করতে চান না তা আমি পরিষ্কার নই? প্রশ্নে আমার মন্তব্য অনুসারে:

হ্যাঁ। প্রতিনিধিটিকে মৃত্যুদণ্ড কার্যকর করার সময় আপনি প্রথমবারের মতো কাজ করতে পারেন বা দ্বিতীয় কলটিতে একটি আলাদা ঘর ফিরে আসতে পারেন? প্রতিনিধিকে ডেকে আনা কি পার্শ্ব প্রতিক্রিয়া হতে পারে?

বার্ট ভ্যান ইনজেন শেহেনো উপরে যেমন বলেছিলেন,

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

সাধারণভাবে, যে কোনও ধরণের অলস লোডটি স্পষ্টতই ত্রুটিগুলি স্থির করে that পয়েন্ট পর্যন্ত।


আমি একটি সরানো [চেক] ঘর পদ্ধতি ব্যবহার করার পরামর্শ দেব। এটি আপনাকে অপরিষ্কার আই / ও দিকগুলি এক জায়গায় আলাদা করতে দেয়।

অনুরূপ রবার্ট হার্ভি'স উত্তর:

এটিকে খাঁটি ফাংশন করতে, এমন একটি আসল অবজেক্টটি ফিরিয়ে দিন যা ফাংশন থেকে প্রত্যাশিত মানকে আবদ্ধ করে এবং এমন কোনও মান একটি সম্ভাব্য ত্রুটির অবস্থার ইঙ্গিত করে, যেমন হতে পারে কোনও বস্তু বা ওয়ার্ক অবজেক্টের ইউনিট।

ইনপুট থেকে কীভাবে (সম্ভাব্য) ব্যতিক্রম পরিচালনা করা যায় তা নির্ধারণ করা কোড রাইটারের উপর নির্ভর করবে। তারপরে পদ্ধতিটি কোনও রুম অবজেক্ট, বা নুল রুম অবজেক্টটি ফিরিয়ে দিতে পারে, বা সম্ভবত ব্যতিক্রমটি বুবলি করে।

এটি এই বিষয়টির উপর নির্ভর করে:

  • রুম ডোমেন কি রুম ব্যতিক্রমগুলি নাল বা আরও খারাপ কিছু হিসাবে বিবেচনা করে।
  • নাল / ব্যতিক্রম কক্ষে ক্লায়েন্ট কোডটি উত্তরকে কীভাবে सूचित করা যায়। (জামিন / স্থিতিশীল পরিবর্তনশীল / গ্লোবাল স্টেট / একটি মোনাড ফিরিয়ে দিন / যাই হোক না কেন; কিছু অন্য কিছু বিশুদ্ধ তবে অন্যরা :))।

-1

হুম ... আমি এই সম্পর্কে সঠিক মনে হয়নি। আমি মনে করি আপনি কী করার চেষ্টা করছেন তা হ'ল অন্যরা কী কাজ করছে তা না জেনে তাদের কাজ সঠিকভাবে করছে তা নিশ্চিত করা।

যেহেতু ফাংশনটি ভোক্তা দ্বারা প্রেরণ করা হয়েছে, যা আপনার বা অন্য কোনও ব্যক্তির দ্বারা লেখা যেতে পারে।

রুম অবজেক্টটি তৈরি হওয়ার সময় যদি ফাংশন পাসটি চালানো বৈধ না হয় তবে কী হবে?

কোড থেকে, আমি নিশ্চিত হতে পারি না উত্তর কী করছে।

বলুন, যদি ফাংশনটি রুম বুক করা হয়, এবং এটির সময় এবং বুকিংয়ের সময় প্রয়োজন হয়, তবে আপনার কাছে তথ্য প্রস্তুত না থাকলে আপনি ব্যতিক্রম পাবেন।

যদি এটি একটি দীর্ঘ চলমান ফাংশন হয়? কোনও রুম অবজেক্ট তৈরি করার সময় আপনি আপনার প্রোগ্রামটি ব্লক করতে চাইবেন না, যদি আপনার 1000 রুম অবজেক্ট তৈরি করার দরকার হয় তবে কী হবে?

আপনি যদি এই শ্রেণীর গ্রাসকারী গ্রাহককে লেখেন তবে আপনি নিশ্চিত হয়ে যে ফাংশনটি উত্তীর্ণ হয়েছে তা সঠিকভাবে লেখা হয়েছে, তাই না?

যদি ভোক্তা লেখেন এমন অন্য কোনও ব্যক্তি রয়েছেন, তবে তিনি কোনও রুম কক্ষ তৈরির "বিশেষ" শর্তটি জানেন না, যা মৃত্যুদন্ড কার্যকর করতে পারে এবং তারা কেন তা জানার চেষ্টা করে তাদের মাথা আঁচড়ান।

আরেকটি বিষয় হ'ল, নতুন ব্যতিক্রম ছুঁড়ে ফেলা ভাল না thing কারণ হ'ল এটিতে মূল ব্যতিক্রম সম্পর্কিত তথ্য থাকবে না। আপনি জানেন যে আপনি একটি ত্রুটি পেয়েছেন (জেনেরিক ব্যতিক্রমের জন্য একটি বন্ধুত্বপূর্ণ mesaage), তবে আপনি কী ত্রুটিটি বুঝতে পারবেন না (নাল রেফারেন্স, সূচকের বাইরে, শূন্য দ্বারা বিভক্ত)। আমাদের তদন্ত করার প্রয়োজন হলে এই তথ্যটি অত্যন্ত গুরুত্বপূর্ণ।

আপনার ব্যতিক্রমটি তখনই পরিচালনা করা উচিত যখন আপনি জানেন এবং কীভাবে এটি পরিচালনা করবেন।

আমি মনে করি আপনার মূল কোডটি যথেষ্ট ভাল, কেবলমাত্র আপনি "মেইন" (বা কোনও স্তর যা এটি হ্যান্ডেল করবেন তা জানতে পারে) ব্যতিক্রমটি পরিচালনা করতে চাইবেন।


1
২ য় কোড উদাহরণটি আবার দেখুন; আমি নতুন ব্যতিক্রমটি নিম্ন ব্যতিক্রম দিয়ে শুরু করি। পুরো স্ট্যাক ট্রেস সংরক্ষণ করা হয়।
রক অ্যান্টনি জনসন

উফ। আমার ভুল.
ব্যবহারকারী 251630

-1

আমি অন্য উত্তরের সঙ্গে অসম্মতি এবং বলবে কোন । ব্যতিক্রমগুলি অন্যথায় খাঁটি ফাংশনকে অপরিষ্কার করে না।

ব্যতিক্রমগুলির যে কোনও ব্যবহার ত্রুটির ফলাফলের জন্য সুস্পষ্ট চেকগুলি ব্যবহার করতে পুনরায় লেখা যেতে পারে। ব্যতিক্রমগুলি কেবল এর উপরে সিনট্যাকটিক চিনি হিসাবে বিবেচনা করা যেতে পারে। সুবিধাজনক সিনট্যাকটিক চিনি খাঁটি কোডকে অশুচি করে না।


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

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

পার্শ্ব-প্রতিক্রিয়া মুক্ত কোড যথেষ্ট নয়। রেফারেন্সিয়াল ট্রান্সপারেন্সি ফাংশন বিশুদ্ধতার জন্যও প্রয়োজনীয় requirement
ইদান আরে

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

1
(... ধারাবাহিক) এবং "কী ক্রমে" - যদি fএবং gউভয়ই খাঁটি ফাংশন হয় তবে f(x) + g(x)আপনি যে আদেশটি মূল্যায়ন করেন f(x)এবং তা নির্বিশেষে একই ফলাফল হওয়া উচিত g(x)। কিন্তু যদি f(x)ছোঁড়ার Fএবং g(x)ছোঁড়ার G, তারপর ব্যতিক্রম এই মত প্রকাশের থেকে নিক্ষিপ্ত হবে Fযদি f(x)প্রথম মূল্যায়ন করা হয় এবং Gযদি g(x)প্রথম মূল্যায়ন করা হয় - এই কিভাবে বিশুদ্ধ ফাংশন আচরণ নেয়া আমার দায়িত্বও বটে যখন ব্যতিক্রমটি রিটার্নের ধরণটিতে এনকোড থাকে, তখন ফলাফলটি Error(F) + Error(G)স্বাধীনভাবে মূল্যায়নের আদেশের মতো হয়ে যায়।
ইদান আরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.