মুদ্রণকে কেন অপরিষ্কার ক্রিয়া হিসাবে বিবেচনা করা হয়?


10

আমি স্ক্যালায় বইয়ের প্রোগ্রামিং পড়ছি, এবং বলা হয়:

... এই ক্ষেত্রে, এর পার্শ্ব প্রতিক্রিয়া স্ট্যান্ডার্ড আউটপুট প্রবাহে মুদ্রণ করছে।

এবং আমি দেখতে পাচ্ছি না যেখানে, পার্শ্ব প্রতিক্রিয়া, যেহেতু একই ইনপুট জন্য, println একই আউটপুট (আমি মনে করি) প্রিন্ট হবে
আপডেট
উদাহরণস্বরূপ যে কোনো সময় আমরা কল:

println(5)

এটি ৫ টি মুদ্রণ করবে, কলিংটি 5 এরprintln(5) চেয়ে অন্য কোনও মান মুদ্রণ করবে এমন কোনও মামলা আমি দেখছি না !


যদি এটি আপনার প্রশ্নের উত্তর দেয়, তবে আমি আমার উত্তরটি মুছে
ফেলব

3
এ উত্তর কি উল্লেখ স্বচ্ছতা কি? এখানে প্রাসঙ্গিক বলে মনে হচ্ছে।
নাথান হিউজেস

1
সংশ্লিষ্ট (লোল) stackoverflow.com/q/4865616/5986907
joelb

2
আপনি ডিটারমিনিস্টিকের সাথে বিভ্রান্ত পার্শ্ব প্রতিক্রিয়া (রেফারেন্সিয়াল স্বচ্ছ নয়)। printlnএকটি নির্বিচারবাদী ফাংশন তবে খাঁটি হওয়ার জন্য এটি অবশ্যই আরটি হতে হবে।
বব

2
কারণ এটি ফলাফলকে গণনা করা এবং এটি ফেরত দেওয়ার পরিবর্তে অন্য কিছু করে।
শেঠ টিস্যু

উত্তর:


6

অভিব্যক্তিটির ফলাফলের সাথে প্রতিস্থাপন করে কোনও অভিব্যক্তির কোনও পার্শ্ব প্রতিক্রিয়া রয়েছে কিনা তা আপনি বলতে পারেন। প্রোগ্রামটির অর্থ যদি পরিবর্তিত হয় তবে এর পার্শ্ব প্রতিক্রিয়া রয়েছে। উদাহরণ স্বরূপ,

println(5)

একটি ভিন্ন প্রোগ্রাম

()

অর্থাৎ, একটি পার্শ্ব প্রতিক্রিয়া হ'ল কোনও পর্যবেক্ষণযোগ্য প্রভাব যা কোনও এক্সপ্রেশনকে মূল্যায়নের ফলাফলের মধ্যে এনকোড করা হয় না। এখানে ফলাফলটি রয়েছে (), তবে সেই মানটির মধ্যে এমন কিছুই নেই যা 5 টি এখন আপনার স্ক্রিনে উপস্থিত হয়েছে enc


6
আসলে এটি "পার্শ্ব-প্রতিক্রিয়া" এর একটি ভাল সংজ্ঞা নয় - একটি পার্শ্ব প্রতিক্রিয়াটিকে এমন কিছু হিসাবে সংজ্ঞায়িত করা যেতে পারে যা প্রাসঙ্গিক স্বচ্ছতা ভঙ্গ করে। আপনি এখানে যা দেখানোর চেষ্টা করেছিলেন তা আরটি ছিল তবে আপনার উদাহরণটি ভুল। যেহেতু একাধিকবার কার্যকর করার জন্য একই জিনিসটি একাধিকবার করা উচিত - বরং, val a = println("hello"); val b = (a, a)একই হওয়া উচিত val b = (pritnln("hello"), println("hello"))
লুইস মিগুয়েল মেজিয়া সুরেজ

1
@ লুইস মিগুয়েলমেজিয়াসুরেজ সম্ভবত আমার উদাহরণটি পরিষ্কার নয় তবে আমি মনে করি এটি ভুল নয়। আমি মূলত প্রোগ্রাম println(5)এবং এর মধ্যে পার্থক্যটি নির্দেশ করছি ()। বা আপনি শেষ বাক্যটি বোঝাতে চেয়েছিলেন?
জোয়েলব

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

আমি আপনার উদাহরণটি পরিষ্কারভাবে বুঝতে পারি না
নাম

5
আমি বলব এটি ভুল কারণ কারণ কোনও কিছুর পক্ষে পার্শ্ব প্রতিক্রিয়া থাকা এবং আদর্শবান হওয়া এতটাই সম্ভব যে এটির পুনরাবৃত্তি করলে এর প্রভাব পরিবর্তন হয় না। যেমন একটি পরিবর্তনীয় ভেরিয়েবলের অ্যাসাইনমেন্ট; আপনি কিভাবে পার্থক্য করতে পারেন x = 1এবং x = 1; x = 1; x = 1?
আলেক্সি রোমানভ

5

নিম্নলিখিত উপমা বিবেচনা করুন

var out: String = ""
def myprintln(s: String) = {
  out += s // this non-local mutation makes me impure
  ()
}

এখানে myprintlnঅপরিষ্কার কারণ প্রত্যাবর্তন মূল্যের পাশাপাশি ()এটি অ-স্থানীয় পরিবর্তনশীলকে outপার্শ্ব-প্রতিক্রিয়া হিসাবেও রূপান্তর করে ates এখন কল্পনা outকরুন স্ট্রিম ভ্যানিলা printlnরূপান্তরিত হবে।


1
আপনাকে ধন্যবাদ, প্রতিক্রিয়া জানাতে, এটি পরিষ্কার যে আপনার ফাংশনটি অপরিষ্কার, তবে,
স্ক্যানায়

1
@aName কারন প্রত্যাবর্তন মূল্যের পাশাপাশি ()এটি অ-স্থানীয় রাষ্ট্রকেও পরিবর্তিত করে System.out
মারিও গ্যালিক

আমি মনে করি এই উত্তরটি থেকে অনুপস্থিত গুরুত্বপূর্ণ ঘটনাটি হ'ল প্রিন্টলন ইনপুটটিতে একটি নতুন লাইনের চরিত্র যুক্ত করে।
ফেডেরিকো এস

4

পার্শ্ব প্রতিক্রিয়া কম্পিউটারের অবস্থায় রয়েছে। প্রতিটি সময় আপনি println()টার্মিনালের প্রদত্ত মান প্রদর্শন করতে মেমরি পরিবর্তনের স্থিতি কল করেন। বা আরও সাধারণভাবে, স্ট্যান্ডার্ড আউটপুট স্ট্রিমের অবস্থা পরিবর্তন করা হয়।


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

2
এইভাবে, যে কোনও ক্রিয়াকলাপ, ক্রিয়াকলাপ .... অপরিষ্কার হবে, যেহেতু এটি পরিবর্তিত হবে, মেমরির অবস্থা
সিপিউ

2

এই প্রশ্নের উত্তরের উত্তর ইতিমধ্যে দেওয়া হয়েছিল, তবে আমার দুটি সেন্ট যোগ করুন।

তোমার ভিতরে দেখবে তাহলে printlnফাংশন মূলত এটা হিসাবে একই java.lang.System.out.println()- তাই যখন আপনি Scala এর স্ট্যান্ডার্ড গ্রন্থাগার ডাকা printlnফণা অধীন পদ্ধতি এটা পদ্ধতি ডাকে printlnউপর PrintStreamযা ক্ষেত্র হিসেবে ঘোষিত হয় বস্তুর উদাহরণস্বরূপ outমধ্যে System(অথবা আরো সঠিকভাবে বর্গ outVarমধ্যে Consoleঅবজেক্ট), যা এটি অভ্যন্তরীণ অবস্থা পরিবর্তন হলে । এটি printlnঅপরিষ্কার কার্যকারিতা কেন এটি অন্য একটি ব্যাখ্যা হিসাবে বিবেচনা করা যেতে পারে ।

আশাকরি এটা সাহায্য করবে!


1

এটি রেফারেন্সিয়াল স্বচ্ছতার ধারণার সাথে সম্পর্কযুক্ত । আপনি যদি প্রোগ্রামটি পরিবর্তন না করে এর মূল্যায়িত ফলাফলের সাথে বিকল্পটি তৈরি করতে পারেন তবে একটি অভিব্যক্তি উল্লেখযোগ্যভাবে স্বচ্ছ ।

যখন কোনও অভিব্যক্তি উল্লেখযোগ্যভাবে স্বচ্ছ হয় না তখন আমরা বলি যে এর পার্শ্ব প্রতিক্রিয়া রয়েছে

f(println("effect"), println("effect"))
// isn't really equivalent to!
val x = println("effect")
f(x, x)

যখন

import cats.effect.IO

def printlnIO(line: String): IO[Unit] = IO(println(line))

f(printlnIO("effect"), printlnIO("effect"))
// is equivalent to
val x = printlnIO("effect")
f(x, x)

আপনি এখানে আরও বিস্তারিত ব্যাখ্যা পেতে পারেন: https://typelevel.org/blog/2017/05/02/io-monad-for-cats.html


আমি দেখতে পাচ্ছি না কেন চ (এক্স, এক্স) চ (প্রিন্টলন ("প্রভাব")), প্রিন্টলন ("প্রভাব")) থেকে আলাদা!
এনেম

f(println("effect"), println("effect"))কনসোল "এফেক্ট" এ দুবার val x = println("effect");f(x,x)মুদ্রণ করতে যাচ্ছে এবং একবার মুদ্রণ করতে চলেছে।
ডিডাক মন্টেরো

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