হাস্কেল ফাংশন রচনা (।) এবং ফাংশন অ্যাপ্লিকেশন ($) আইডিয়ামগুলি: সঠিক ব্যবহার


129

আমি রিয়েল ওয়ার্ল্ড হাস্কেল পড়ছি , এবং আমি শেষের কাছাকাছি এসেছি, তবে শৈলীর বিষয়টি অপারেটর (.)এবং ($)অপারেটরদের সাথে করার জন্য আমাকে অবহেলা করছে ।

যখন আপনি এমন কোনও ফাংশন লিখেন যা অন্য ফাংশনের সংমিশ্রণ থাকে আপনি এগুলি লিখেন:

f = g . h

তবে আপনি যখন এই ফাংশনগুলির শেষে কিছু প্রয়োগ করেন তখন আমি এটি এই জাতীয়ভাবে লিখি:

k = a $ b $ c $ value

তবে বইটি এটি লিখবে:

k = a . b . c $ value

এখন, আমার কাছে তারা কার্যত সমান দেখায়, তারা আমার চোখে ঠিক একই জিনিস করে। যাইহোক, আমি যত বেশি দেখছি, লোকেরা বইটি যেভাবে তাদের ফাংশনগুলি লিখতে দেখছে: (.)প্রথমে রচনা করুন এবং তারপরে কেবল শেষের ($)দিকে লটটি মূল্যায়নের জন্য একটি মূল্য সংযোজন করতে ব্যবহার করুন (এটি বহু ডলারের রচনা দিয়ে কেউ করেন না) ।

বইগুলি এমনভাবে ব্যবহার করার কোনও কারণ আছে যা সমস্ত ($)চিহ্ন ব্যবহার করার চেয়ে অনেক ভাল ? বা এখানে এমন কোনও সেরা অনুশীলন রয়েছে যা আমি পাচ্ছি না? বা এটি অতিরিক্ত অতিরিক্ত এবং আমি একেবারে চিন্তা করা উচিত নয়?


4
নোট করুন যে দ্বিতীয় উদাহরণটি হিসাবে করা যেতে পারেk = a $ b $ c value
থমাস এডিং

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

2
আর একটি সাধারণ পদ্ধতি হল a . b $ c value, যা আমি তৃতীয় উদাহরণের মতো পছন্দ করি না তবে কয়েকটি চরিত্র সংরক্ষণ করে।
জন এল

উত্তর:


153

আমার ধারণা আমি কর্তৃপক্ষের কাছ থেকে এর উত্তর দিতে পারি।

বইগুলি এমনভাবে ব্যবহার করার কোনও কারণ আছে যা সমস্ত ($) চিহ্ন ব্যবহার করার চেয়ে অনেক ভাল?

এর কোন বিশেষ কারণ নেই। ব্রায়ান এবং আমি দুজনই লাইনের আওয়াজ কমাতে পছন্দ করি। .চেয়ে শান্ত $। ফলস্বরূপ, বইটি f . g . h $ xসিনট্যাক্স ব্যবহার করে ।


3
ঠিক আছে, আমি এর চেয়ে ভাল উত্তরের আশা করতে পারি না; লেখক নিজে থেকেই। :) এবং এটি বোঝা যায় যে, আমি যেমন পড়ছি তেমন পৃষ্ঠায় এটি আরও শান্ত দেখাচ্ছে। এটিকে উত্তর হিসাবে চিহ্নিত করা হচ্ছে কারণ এটি সরাসরি প্রশ্নের উত্তর দেয়। প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ; এবং, আসলে, বই।
রবার্ট ম্যাসাওলি

38
লেখকের সাথে দ্বিমত পোষণ করার জন্য নয়, তবে আমি মনে করি এটি ব্যবহার করার চেয়ে কিছু তৈরি করার মানসিক মডেলটিতে আরও একটি আরও বিশদ কারণ রয়েছে । হাস্কেল ব্যবহারকারীরা বরং একটি নতুন চালাক সৃষ্টি হিসাবে ভাবতে চান । এখন তারা একটি নতুন ডাকছে, যদিও বেনামে, ফাংশন যা তারা তৈরি করেছে কেবল পিএইচপি ব্যবহারকারীর মতো প্রিফ্যাবড ফাংশন কলগুলির একটি বৃহত অভিধান জড়ানোর চেয়ে। f.g.hf(g(h()))
ইভান ক্যারল

1
এটি একটি আকর্ষণীয় বক্তব্য: 'লাইন গোলমাল হ্রাস করুন' এবং 'এর চেয়ে শান্ত'। আমি এই পরিভাষায় প্রোগ্রামিং ভাষা সম্পর্কে কখনও ভাবিনি, তবে এটি সঠিক ধারণা দেয়।
রবিডিস্কি

53

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

k = a (b (c (value)))

এবং

k = (a . b . c) value

করা উচিত ছিল কারণ .উপর সংস্করণ $নান্দনিক আবেদন: সংস্করণের থেকে উচ্চতর খুব আলাদা সংস্করণ উপর উভয় পছন্দ জন্য একই কারণ নেই।

যদিও, কেউ কেউ ভাবতে পারেন যে যদি বন্ধনের পরিবর্তে ইনফিক্স অপারেটরগুলি ব্যবহার করা লিস্পের সাথে কোনও সম্ভাব্য সাদৃশ্য এড়াতে কিছু অবচেতন আকাঙ্ক্ষার উপর ভিত্তি করে তৈরি হয় (কেবল মজা করছি ... আমি মনে করি?)।


38

আমি এটি যুক্ত করব f . g $ x, f . gএকটি অর্থবহ সিনট্যাকটিক ইউনিট।

এদিকে, মধ্যে f $ g $ x, f $ gঅর্থবোধক একক নয়। একটা চেন $তর্কসাপেক্ষে আরো আবশ্যক - প্রথম ফল পেতে gএর x, তারপর কি fএটি, তারপর কি fooএটি, তারপর ইত্যাদি

ইতিমধ্যে একটি শৃঙ্খলে .তর্কযোগ্যভাবে আরও ঘোষিত, এবং কোনও অর্থে ডেটাফ্লো কেন্দ্রিক দৃষ্টিভঙ্গির কাছাকাছি - একটি ক্রিয়াকলাপ রচনা করুন এবং শেষ পর্যন্ত এগুলিকে কোনও কিছুর সাথে প্রয়োগ করুন।


2
আমি হাস্কেল শিখছি (কোনও অর্থবোধক কোড কোড করে নি) তবে আমি pipe এক ধরণের "পাইপ" অপারেটর হিসাবে ভাবতে চাই। এটি অনেকটা টার্মিনালের মতো | পাইপ (ডাটা ব্যতীত ডান থেকে বাম প্রবাহিত হয়) তবে টার্মিনাল প্রক্রিয়াগুলির মতো প্রতিটি ইউনিট সুস্পষ্টভাবে স্বাধীন।
নভেম্বর

1
$অপারেটর একইভাবে আচরণ করে বলে মনে হয় <|এফ # টি অপারেটর। আমি বিশ্বাস করি উভয়কেই একইরূপে সংজ্ঞায়িত করা হয়, বাস্তবে - এফ # (<|) a b = a bএবং হাস্কেলের মধ্যে a $ b = a b, যা মূলত সমান।
টম গ্যালভিন

@ কৌম্যাটিক মোটামুটি নিশ্চিত এটি (<|) b a = a bএফ # তে রয়েছে, যেহেতু এটি মেমোরিটি পরিবেশনার মতো ব্যবহার করা হয় [1; 2; 3; 4; 5] <| List.map ((+) 1)
বালিনকিংঅফমোরিয়া

@ বালিনকিংঅফমোরিয়া <|অপারেটরটি ফাংশনটিকে মান হিসাবে পাস করার পরিবর্তে ফাংশনে মান দেয় - পরিবর্তে আপনার কোড উদাহরণ |>অপারেটরের সাথে কাজ করবে ।
টম গ্যালভিন

পছন্দ করুন একাধিক সংস্করণ ছিল তা অবগত ছিল না (আমি F # খুব বেশি ব্যবহার করি না)।
বালিনকিংঅফমোরিয়া পুনরায় ইনস্টল করা মুখ্যমন্ত্রী

18

আমার জন্য, আমি মনে করি উত্তরটি (ক) ঝরঝরে, যেমন ডন বলেছেন ; এবং (খ) আমি দেখতে পাচ্ছি যে আমি যখন কোড সম্পাদনা করছি তখন আমার ফাংশনটি বিন্দু মুক্ত শৈলীতে শেষ হতে পারে এবং তারপরে আমাকে যা করতে হবে তা হ'ল $পিছনে ফিরে সমস্ত কিছু বদলে শেষ মুছতে হবে delete একটি গৌণ বিষয়, অবশ্যই, কিন্তু একটি নব্বই।


হ্যাঁ এটি এ জাতীয় লেখার একটি ভাল কারণ, যদি আপনি কোনও ফাংশন রচনাতে শেষ করতে চান তবে এটি আরও দ্রুত। :) হ্যাঁ কীস্ট্রোক সংরক্ষণের জন্য, তবে আরও গুরুত্বপূর্ণ। +1
রবার্ট ম্যাসাওলি

13

এই হ্যাসেল-ক্যাফে থ্রেডটিতে এই প্রশ্নের একটি আকর্ষণীয় আলোচনা রয়েছে । দৃশ্যত সেখানে সংখ্যালঘু দৃষ্টিকোণ যে ঝুলিতে যে ডান associativity এর $হয় "শুধু প্লেইন ভুল" , এবং নির্বাচন f . g . h $ xউপর f $ g $ h $ xইস্যু পার্শ্ব-পদবিন্যাস এক উপায়।


আরে, আপনি এই বিষয়ে একটি সম্পূর্ণ আলোচনা খুঁজে পেয়েছেন। এটা দুর্দান্ত, আমি এখন পড়ছি। +1
রবার্ট ম্যাসাওলি

2
অনুরূপ যুক্তি এখানে: ghc.haskell.org/trac/haskell-prime/wiki/…
enrique

দ্রষ্টব্য যে $!"সাধারণ ভুল" সঠিক সাহচর্য রয়েছে - কেন $! অপারেটর ডান সাহসী?
ইম্জ - ইভান জ্যাচারিয়াশেভ

3

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

আপনার পদ্ধতিটি কেবল অদ্ভুত দেখাচ্ছে এবং শেষটি $অপ্রয়োজনীয়।

তবে, এটি আসলে কিছু যায় আসে না। হাস্কেলে সাধারণত একই জিনিসটি করার অনেকগুলি, অনেকগুলি সঠিক উপায়।


3
আমি লক্ষ্য করিনি যে শেষটি unnecessary অপ্রয়োজনীয় তবে আমার উচিত। ধন্যবাদ এবং আমি এটি সেখানে রেখেছি যাতে লোকেরা জানতে পারে যে এই মন্তব্যের অর্থ কী।
রবার্ট ম্যাসাওলি

0

আমি বুঝতে পারি এটি একটি খুব পুরানো প্রশ্ন, তবে আমি মনে করি এর আরও একটি কারণ আছে যা উল্লেখ করা হয়নি।

আপনি যদি কোনও নতুন বিন্দু মুক্ত ফাংশন ঘোষণা করছেন তবে আপনি f . g . hযে মানটি পাস করেছেন তা স্বয়ংক্রিয়ভাবে প্রয়োগ করা হবে। তবে আপনি যদি লিখেন তবে f $ g $ hএটি কার্যকর হবে না।

আমি মনে করি লেখক কম্পোজিশন পদ্ধতিটি পছন্দ করার কারণ কারণ এটি কার্য সম্পাদন করার একটি ভাল অনুশীলনের দিকে পরিচালিত করে।

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