সিস্টেমে অ্যাক্সেস করা হচ্ছে কেন? হাসকেলের আইও অপারেশন বিবেচনা করা হয় না?


25

মডিউলটিতে System.Infoআমি এই ফাংশনগুলি দেখতে পাচ্ছি:

os :: String
arch :: String
compilerName :: String
compilerVersion :: Version

কেন সেখানে নেই IO? তারা সিস্টেমে অ্যাক্সেস করছে ... আমি কি ভুল করছি? আমার প্রত্যাশা এমন কিছু ছিল:

os :: IO String
arch :: IO String
compilerName :: IO String
compilerVersion :: IO Version

ব্যবহারের ক্ষেত্রে:

      print os            -- "darwin"
      print arch          -- "x86_64"
      print compilerName  -- "ghc"

উত্তর:


29

রানটাইমে আপনি সেই তথ্য পাচ্ছেন না । আপনার সিস্টেমে ইনস্টল করা হিসাবে সেগুলি সংকলকটিতে হার্ডকোড করা আছে।

আপনি compilerNameযদি http://hackage.haskell.org/package/base-4.12.0.0/docs/src/System.Info.html পাওয়া যায় তার জন্য সংজ্ঞাটি দেখুন তবে এটি সর্বাধিক সুস্পষ্ট ।

compilerName :: String
compilerName = "ghc"

এমনকি কিছু os

os :: String
os = HOST_OS

অন্যথায় অপরিজ্ঞাত নামের HOST_OS(বড় হাতের অক্ষর দিয়ে শুরু হওয়া একটি মান) এর সংজ্ঞা দেওয়া হয়েছে যা প্রস্তাব দেয় যে এটি কেবলমাত্র একটি স্থানধারক যা ইনস্টলেশন চলাকালীন প্রতিস্থাপন হয়ে যায়।

কেউ আমাকেও সংশোধন করতে পারেন (দয়া করে!), তবে সেই {-# LANGUAGE CPP #-}ফাইলের শীর্ষে প্রগমাটি পরামর্শ দেয় যে HOST_OSএবং সংকলনের আগে সি প্রিপ্রসেসর দ্বারা উপযুক্ত স্ট্রিংগুলি দ্বারা প্রতিস্থাপন করা হয়েছে।


2
ওপি যদি সত্যিই IOসেখানে কিছু চায় তবে uname(3)হ্যাকেজের চারপাশে একটি মোড়ক পাওয়া যায়: হ্যাকেজ.হেসকেল.আর
প্যাকেজ

19

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

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

যাই হোক না কেন ... আমি বলব আপনার প্রত্যাশাগুলি দৃ are়, এবং এই ধরণেরগুলি historicalতিহাসিক বিজোড়গুলির ফলাফল।


-9

সম্পাদনা: এই উত্তরটিকে কেন নিম্নমানের করা হচ্ছে তা ব্যাখ্যা করার জন্য @ আন্তজারয় এবং @ আন্টাল স্পেক্টর-জাবুসকিকে ধন্যবাদ জানাই। তারা লিখেছে

ডকুমেন্টেশনটি কিছুটা বিভ্রান্তিকর। মানগুলি জিএইচসি সংকলকটিতে হার্ডকোড করা হয়। 48 বছর পরে আপনি অবশ্যই জানেন যে আসল কোড সর্বদা ডকুমেন্টেশন ট্রাম্প করে। - আন্তঃজয় গতকাল @ andy256 আপনি ঠিক বলেছেন যে ডকুমেন্টেশনটি খারাপ (সত্যই, ফ্রান্সিসকো এই প্রশ্নটি প্রথমে কেন জিজ্ঞাসা করেছিল তারই অংশ) এবং আপনার বিভ্রান্তি বোধগম্য। হাস্কেলের বিষয়টি হ'ল যদি সেই স্ট্রিংয়ের মানগুলি রানটাইমের সময় পরিবর্তিত হতে পারে তবে এটি একটি বিরাগ বাগ হতে পারে - ভেরিয়েবলগুলি পরিবর্তনের অনুমতি নেই। এটি আইও টাইপ কনস্ট্রাক্টরের তাত্পর্য - এটি এমন একটি গণনা উপস্থাপন করে যা "বাইরের বিশ্বের" অ্যাক্সেস করার অনুমতি দেয় এবং সুতরাং যার ফলাফল পরিবর্তন হতে পারে। সিস্টেম কল করা আইও অ্যাকশনের একটি ভাল উদাহরণ। … [1/2] - আন্টাল স্পেক্টর-জাবুস্কি 9 ঘন্টা আগে @ andy256… (আরও একটি আইও ক্রিয়া "গ্লোবাল কাউন্টারকে আপডেট করা" হতে পারে)) সুতরাং যখন আমরা কোনও স্ট্রিং দেখি, আমরা জানি যে এটি কোনও যোগাযোগ করতে পারে না with হুডের নীচে ওএস। এই কারণেই, সম্ভবত আশ্চর্যরকমভাবে যদি আপনি হাস্কেল ব্যবহার করেন না তবে ওএস বাস্তবায়ন করা সহজ হবে না: সিস্টেম কল করা স্ট্রিং - এরকম কোনও মান বেসিক হাস্কেলের ক্ষেত্রে অপরিবর্তনীয়, প্রোগ্রামগুলির প্রতিটি প্রোগ্রামের প্রত্যাশা লঙ্ঘন করবে কাজ, এবং সংকলক এবং অপ্টিমাইজার সম্ভাব্য এমনকি ট্রিপ (কোনও তাত্ত্বিক উদ্বেগ নয় - সেখানে স্ট্যাক ওভারফ্লো উত্তর রয়েছে যেখানে লোকেরা সাদৃশ্যযুক্ত সমস্যার মধ্যে চলে)) [2/2] - আন্টাল স্পেক্টর-জাবুস্কি এই কারণেই, সম্ভবত আশ্চর্যরকমভাবে যদি আপনি হাস্কেল ব্যবহার করেন না তবে ওএস বাস্তবায়ন করা সহজ হবে না: সিস্টেম কল করা স্ট্রিং - এরকম কোনও মান বেসিক হাস্কেলের ক্ষেত্রে অপরিবর্তনীয়, প্রোগ্রামগুলির প্রতিটি প্রোগ্রামের প্রত্যাশা লঙ্ঘন করবে কাজ, এবং সংকলক এবং অপ্টিমাইজার সম্ভাব্য এমনকি ট্রিপ (কোনও তাত্ত্বিক উদ্বেগ নয় - সেখানে স্ট্যাক ওভারফ্লো উত্তর রয়েছে যেখানে লোকেরা সাদৃশ্যযুক্ত সমস্যার মধ্যে চলে)) [2/2] - আন্টাল স্পেক্টর-জাবুস্কি এই কারণেই, সম্ভবত আশ্চর্যরকমভাবে যদি আপনি হাস্কেল ব্যবহার করেন না তবে ওএস বাস্তবায়ন করা সহজ হবে না: সিস্টেম কল করা স্ট্রিং - এরকম কোনও মান বেসিক হাস্কেলের ক্ষেত্রে অপরিবর্তনীয়, প্রোগ্রামগুলির প্রতিটি প্রোগ্রামের প্রত্যাশা লঙ্ঘন করবে কাজ, এবং সংকলক এবং অপ্টিমাইজার সম্ভাব্য এমনকি ট্রিপ (কোনও তাত্ত্বিক উদ্বেগ নয় - সেখানে স্ট্যাক ওভারফ্লো উত্তর রয়েছে যেখানে লোকেরা সাদৃশ্যযুক্ত সমস্যার মধ্যে চলে)) [2/2] - আন্টাল স্পেক্টর-জাবুস্কি এবং সম্ভাব্য এমনকি সংকলক এবং অপ্টিমাইজার ট্রিপও (তাত্ত্বিক উদ্বেগ নয় - এমন স্ট্যাক ওভারফ্লো উত্তর রয়েছে যেখানে লোকেরা সাদৃশ্যযুক্ত সমস্যার মধ্যে চলে)। [2/2] - আন্টাল স্পেক্টর-জাবুস্কি এবং সম্ভাব্য এমনকি সংকলক এবং অপ্টিমাইজার ট্রিপও (তাত্ত্বিক উদ্বেগ নয় - এমন স্ট্যাক ওভারফ্লো উত্তর রয়েছে যেখানে লোকেরা সাদৃশ্যযুক্ত সমস্যার মধ্যে চলে)। [2/2] - আন্টাল স্পেক্টর-জাবুস্কি

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

আসল উত্তর:

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

ডকুমেন্টেশন আমার ব্যাখ্যা অনুসরণ।

os :: String - এটি আপনাকে "অপারেটিং সিস্টেমটি দেয় যার উপর প্রোগ্রামটি চলছে" "

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

arch :: String - এটি আপনাকে "মেশিন আর্কিটেকচারটি দেয় যার উপর প্রোগ্রামটি চলছে।"

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

compilerName :: String - এটি আপনাকে "হাস্কেল বাস্তবায়ন দেয় যার সাথে প্রোগ্রামটি সংকলিত হয়েছিল বা ব্যাখ্যা করা হচ্ছে।"

এই মানটি অবশ্যই সংকলক / দোভাষী দ্বারা isোকানো হয়েছে।

compilerVersion :: String- এটি আপনাকে " compilerNameপ্রোগ্রামটি সংকলিত হয়েছিল বা ব্যাখ্যা করা হচ্ছে তার সংস্করণ " "

এই মানটি অবশ্যই সংকলক / দোভাষী দ্বারা isোকানো হয়েছে।

আপনি প্রথম দুটি কলটি ইনপুট পাওয়ার জন্য বিবেচনা করতে পারছেন, ফল অপারেটিং সিস্টেম দ্বারা রাখা মান থেকে আসে values I / O সাধারণত গৌণ স্টোরেজ অ্যাক্সেস বোঝায়।


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

"আপনি বাহ্যিক পরিবেশ ব্যবহার করতে পারবেন না, এই জাতীয় ফাংশনগুলিতে সিস্কল করুন" - অবশ্যই আপনি পারবেন, বিশেষত যদি "আপনি" হাস্কেল সংকলক হন! হাস্কেল বাস্তবায়নের জন্য এটি কার্যকর করা খুব সহজ হবে os :: Stringযাতে এটি যখন মূল্যায়ন করা হয় তখন এটি একটি সিস্টেম কল করে।
ট্যানার সোয়েট

2
আমি মনে করি না আপনি হাস্কেলের আইও মনাদের তাত্পর্যটি বুঝতে পেরেছেন।
স্নেফটেল

@ স্নেফটেল আপনি অবশ্যই সঠিক আমি উত্তরটি বেছে নিয়েছি কারণ প্রতিটি দৃষ্টান্তে 48 বছর প্রোগ্রামিংয়ের পরে এবং বিজোড় সংকলক লেখার পরে, প্রাথমিক উত্তরগুলি ডকুমেন্টেশনের সাথে মেলে না এবং তারা এখনও দেয় না। এটি পরিষ্কারভাবে বলে যে osএবং archরানটাইম এ প্রাপ্ত হয়।
andy256

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