হাস্কেল রচনা (।) বনাম এফ # এর পাইপ ফরোয়ার্ড অপারেটর (|>)


100

এফ # তে, পাইপ-ফরোয়ার্ড অপারেটরের ব্যবহার |>খুব সাধারণ। যাইহোক, হাস্কেলে আমি কেবল কখনও (.)ব্যবহৃত হয়েছে ফাংশন রচনা, দেখেছি । আমি বুঝতে পারি যে এগুলি সম্পর্কিত , তবে কোনও ভাষার কারণেই কি পাইপ-ফরোয়ার্ড হাস্কেল ব্যবহার করা হয়নি বা এটি অন্য কিছু?


2
লিহানসিসের উত্তরে বলা হয়েছে যে &এটি হাস্কেলের |>। এই থ্রেডে গভীরভাবে কবর দেওয়া হয়েছে এবং আমাকে আবিষ্কার করতে কয়েক দিন সময় নিল। আমি এটি প্রচুর ব্যবহার করি কারণ আপনি আপনার কোডটি অনুসরণ করতে স্বাভাবিকভাবে বাম থেকে ডানদিকে পড়েন।
ইটমুক্কেল ২

উত্তর:


61

আমি একটু জল্পনা করা হচ্ছে ...

সংস্কৃতি : আমি মনে করি |>এফ # "সংস্কৃতি" এর একটি গুরুত্বপূর্ণ অপারেটর এবং সম্ভবত একইভাবে .হাস্কেলের পক্ষেও রয়েছে। এফ # এর একটি ফাংশন কম্পোজিশন অপারেটর রয়েছে <<তবে আমি মনে করি এফ # সম্প্রদায় হাস্কেল সম্প্রদায়ের তুলনায় পয়েন্টমুক্ত স্টাইল ব্যবহার করতে ঝোঁক ।

ভাষার পার্থক্য : তুলনা করার জন্য আমি উভয় ভাষারই যথেষ্ট জানি না, তবে লেট-বাইন্ডিংগুলিকে সাধারণীকরণের নিয়মগুলি এটিকে প্রভাবিত করার জন্য যথেষ্ট আলাদা। উদাহরণস্বরূপ, আমি F # তে কখনও কখনও লিখতে জানি

let f = exp

সংকলন করবে না এবং আপনার স্পষ্টত এটা-রূপান্তর দরকার:

let f x = (exp) x   // or x |> exp

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

(ব্যক্তিগতভাবে আমি পয়েন্ট-মুক্ত শৈলীটি অপঠনযোগ্য দেখতে পেয়েছি তবে আমি মনে করি প্রতিটি নতুন / ভিন্ন জিনিস অপরিশোধনযোগ্য বলে মনে হয় যতক্ষণ না আপনি এটি অভ্যস্ত হয়ে পড়েছেন))

আমি মনে করি যে উভয়ই উভয় ভাষায়ই সম্ভাব্য কার্যকর এবং ইতিহাস / সংস্কৃতি / দুর্ঘটনা সংজ্ঞায়িত করতে পারে যে কেন প্রতিটি সম্প্রদায় আলাদা "আকর্ষক" এ বসেছে।


7
আমি সাংস্কৃতিক পার্থক্য সঙ্গে একমত। Ditionতিহ্যবাহী হাস্কেল ব্যবহার করে .এবং $তাই লোকেরা সেগুলি ব্যবহার চালিয়ে যায়।
Amok

9
পয়েন্ট ফ্রি কখনও কখনও পয়েন্টফুলের চেয়ে বেশি পঠনযোগ্য, কখনও কখনও কম। ল্যাম্বডা বিশৃঙ্খল জিনিস এড়াতে এড়াতে আমি সাধারণত মানচিত্র এবং ফিল্টার এর মতো ফাংশনগুলির পক্ষে যুক্তিতে এটি ব্যবহার করি। আমি মাঝে মাঝে এটি শীর্ষ-স্তরের ফাংশনগুলিতেও ব্যবহার করি তবে কম প্রায়ই এবং কেবল যখন এর কিছু সোজা হয়।
পল জনসন

2
আমি এতে খুব বেশি সংস্কৃতি দেখছি না, এই অর্থে যে এফ # এর সাথে সম্পর্কিত বিষয়টির পক্ষে খুব বেশি পছন্দ হয় না (যে কারণে আপনি এবং গণেশ উল্লেখ করেছেন)। সুতরাং আমি বলব যে দুটিই হাস্কেলের ক্ষেত্রে কার্যকর, তবে এফ # অবশ্যই পাইপলাইন অপারেটরটি ব্যবহারের জন্য আরও ভাল সজ্জিত।
কর্ট শেলফথআউট

2
হ্যাঁ, বাম থেকে ডান পড়ার সংস্কৃতি :) এমনকি গণিতও সেভাবে শেখানো উচিত ...
নিকোলাস

1
বাঁদিক থেকে ডানদিকে টিকিটগুলি একটি স্বেচ্ছাসেবী পছন্দ। আপনি ডান থেকে বামে অভ্যস্ত হতে পারেন।
মার্টিন ক্যাপোডিসি

86

(|>)বাম থেকে ডান টাইপচেকিংয়ের কারণে এফ # তে গুরুত্বপূর্ণ। উদাহরণ স্বরূপ:

List.map (fun x -> x.Value) xs

সাধারণত টাইপচেক হবে না, কারণ টাইপচেকার এটি দেখার সময় এমনকি ল্যাম্বডায় xsআর্গুমেন্টের xধরণটি জানা যায়নি, সুতরাং কীভাবে সমাধান করবেন তা জানেন না x.Value

বিপরীতে

xs |> List.map (fun x -> x.Value)

সূক্ষ্ম কাজ করবে, কারণ প্রকারটি পরিচিত হওয়ার ধরণের দিকে পরিচালিত xsকরবে x

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


1
আকর্ষণীয় এটি হ'ল ডান-বাম-বাম তথ্যের একই দিকের সাথে হাস্কেলের (()) এর মতো (<|) অপারেটর রয়েছে। তবে কীভাবে এর জন্য কাজের ধরণের রেজোলিউশন হবে?
The_Ghost

7
(<|) আসলে হাস্কেলের ($) এর অনুরূপ। বাম-থেকে-ডান টাইপচেকিং কেবল।। মান যেমন, <<) অন্যান্য পরিস্থিতিতে ঠিকঠাক কাজ করে, বা যদি আপনি স্পষ্টত প্রকারের টীকাগুলি ব্যবহার করেন তবে ডাইস-ডান-রাইট টাইপচেকিংয়ের প্রয়োজন।
জিএস - মনিকা

44

আরও জল্পনা, এবার প্রধানত হাস্কেল পক্ষ থেকে ...

($)(|>)আপনি যখন পয়েন্ট-ফ্রি কোড লিখতে না পারেন তখন এটির ফ্লিপ এবং এর ব্যবহার বেশ সাধারণ। সুতরাং (|>)হাস্কেলটিতে ব্যবহৃত না হওয়ার মূল কারণটি হ'ল এর জায়গাটি ইতিমধ্যে নেওয়া হয়েছে ($)

এছাড়াও, কিছুটা F # অভিজ্ঞতা থেকে কথা বললে, আমি মনে করি (|>)এফ # কোডে এত জনপ্রিয় কারণ এটি ওওর Subject.Verb(Object)কাঠামোর সাথে সাদৃশ্যপূর্ণ । যেহেতু এফ # একটি মসৃণ ক্রিয়ামূলক / ওও সংহতকরণের লক্ষ্যে রয়েছে তাই Subject |> Verb Objectনতুন কার্যনির্বাহী প্রোগ্রামারদের জন্য বেশ মসৃণ রূপান্তর।

ব্যক্তিগতভাবে, আমি বাম-থেকে-ডানদিকেও ভাবতে পছন্দ করি, তাই আমি (|>)হাসকেলে ব্যবহার করি, তবে আমি মনে করি না যে আরও অনেক লোক তা করেন।


হাই নাথান, হাস্কেল প্ল্যাটফর্মের কোথাও "ফ্লিপ ($)" পূর্বনির্ধারিত? "(|>)" নামটি ইতিমধ্যে ডেটাতে সংজ্ঞায়িত করা হয়েছে anotherএকটি অর্থ সহ অন্যথায় e যদি ইতিমধ্যে সংজ্ঞায়িত না হয়, আপনি এটিকে কী বলে? আমি "($>) = ফ্লিপ ($)"
ম্যাটব্হ

2
@ ম্যাটটিবিএইচ: হুগলের সাথে আমি খুঁজে পাচ্ছি না। আমি জানতাম না Data.Sequence.|>, তবে $>সেখানে বিরোধগুলি এড়াতে যুক্তিসঙ্গত মনে হচ্ছে। সত্যিই, কেবলমাত্র অনেকগুলি সুদর্শন অপারেটর রয়েছে, তাই আমি কেবল |>উভয়ের জন্য ব্যবহার করব এবং কেস-কেস-কেস ভিত্তিতে বিরোধগুলি পরিচালনা করব। (এছাড়াও আমি কেবল ওরফে Data.Sequence.|>হিসাবে প্রলুব্ধ হবে snoc)
নাথান শিভলি-স্যান্ডার্স

2
($)এবং (|>)অ্যাপ্লিকেশনটি রচনা নয়। দুটি (প্রশ্ন নোট হিসাবে) সম্পর্কিত হয় কিন্তু তারা একই হয় না (আপনার fcহয় (Control.Arrow.>>>)ফাংশন জন্য)।
নাথান শিভলি-স্যান্ডার্স

11
অনুশীলনে, এফ # এর |>আসলে আমাকে |অন্য কোনও কিছুর চেয়ে ইউনিক্সের কথা মনে করিয়ে দেয় ।
কেভিন কেন্টু

3
|>এফ # এর আরও একটি সুবিধা হ'ল ভিজ্যুয়াল স্টুডিওতে ইন্টেলিসেন্সের জন্য এটির দুর্দান্ত বৈশিষ্ট্য রয়েছে। টাইপ করুন |>, এবং আপনি কোনও ফাংশনের একটি তালিকা পাবেন যা .কোনও বস্তুর পরে টাইপ করার সময় যা ঘটে তার অনুরূপ বাম দিকের মানটিতে প্রয়োগ করা যেতে পারে ।
ক্রিস্টোফার জনসন

32

আমি মনে করি আমরা বিভ্রান্তিকর জিনিস। হাস্কেলের ( .) F # এর ( ) সমতুল্য >>। এফ # এর ( |>) এর সাথে বিভ্রান্ত হওয়ার দরকার নেই যা কেবল উল্টানো ফাংশন অ্যাপ্লিকেশন এবং হাস্কেলের মতো ( $) - বিপরীত:

let (>>) f g x = g (f x)
let (|>) x f = f x

আমি বিশ্বাস করি হাসকল প্রোগ্রামাররা $প্রায়শই ব্যবহার করে । এফ # প্রোগ্রামাররা যতবার ব্যবহার করতে চান ততবার নয় |>। অন্যদিকে, কিছু এফ # ছেলে >>একটি হাস্যকর ডিগ্রি ব্যবহার করে: http://blogs.msdn.com/b/ashleyf/archive/2011/04/21/programming-is- pointless.aspx


2
হিসাবে আপনি বলে Haskell, এর মত $অপারেটর - বিপরীত, এছাড়াও আপনি সহজেই এটি সংজ্ঞায়িত করতে: a |> b = flip ($)যা এফ # 's করা পাইপলাইন সমতুল্য হয়ে তারপর আপনি কি করতে পারেন EG[1..10] |> map f
ভিস

8
আমি মনে করি ( .) ( ) হিসাবে একই <<, অন্যদিকে ( >>) বিপরীত রচনা। এটি ( >> ) : ('T1 -> 'T2) -> ('T2 -> 'T3) -> 'T1 -> 'T3বনাম( << ) : ('T2 -> 'T3) -> ('T1 -> 'T2) -> 'T1 -> 'T3
ডবস ভেন্ডারমার

"ব্যবহারের জন্য >> একটি হাস্যকর ডিগ্রি পর্যন্ত" -1। (ঠিক আছে, আমি না কিন্তু আপনি আমার বক্তব্য পেয়েছি)। এফ এফ # এ "ক্রিয়ামূলক" জন্য, সুতরাং ফাংশন রচনাটি বৈধ।
ফ্লোরিয়ান এফ

1
অবশ্যই আমি সম্মত যে ফাংশন রচনাটি বৈধ। "কিছু এফ # লোক" দ্বারা আমি নিজেকে উল্লেখ করছি! এটা আমার নিজের ব্লগ। : পি
অ্যাশলেএফ

আমি এর .সমতুল্য বলে মনে করি না >>। আমি জানি না যে এফ # এর আছে কিনা <<তবে এটি সমান হবে (এলমের মতো)।
ম্যাট যোগদানকারী

28

আপনি এফ # ব্যবহার করতে চান তাহলে 's |>মধ্যে Haskell তারপর Data.Function হয় &(যেহেতু অপারেটর base 4.8.0.0)।


হাস্কেলকে বেছে &নেওয়ার কোনও কারণ |>? আমি মনে করি |>এটি অনেক বেশি স্বজ্ঞাত এবং এটি আমাকে ইউনিক্স পাইপ অপারেটরের স্মরণ করিয়ে দেয়।
হ্যাঁহেম্ম

16

হাস্কেলের বাম থেকে ডান রচনা composition

কিছু লোক হাস্কেলতেও বাম থেকে ডান (বার্তা-পাসিং) স্টাইল ব্যবহার করে। দেখুন, উদাহরণস্বরূপ, এমপিদের Hackage উপর গ্রন্থাগার। একটি উদাহরণ:

euler_1 = ( [3,6..999] ++ [5,10..999] ).unique.sum

আমি মনে করি এই স্টাইলটি কিছু পরিস্থিতিতে দুর্দান্ত দেখায়, তবে এটি পড়া আরও শক্ত (লাইব্রেরিটি এবং এর সমস্ত অপারেটরগুলির জানা দরকার, পুনরায় সংজ্ঞায়িতটিও (.)বিরক্তিকর)।

বেস প্যাকেজের অংশ কন্ট্রোল.শ্রেণীর বিভাগে বাম থেকে ডান পাশাপাশি ডান থেকে বাম রচনা অপারেটরগুলিও রয়েছে । তুলনা করুন >>>এবং <<<যথাক্রমে:

ghci> :m + Control.Category
ghci> let f = (+2) ; g = (*3) in map ($1) [f >>> g, f <<< g]
[9,5]

কখনও কখনও বাম থেকে ডান রচনাটি পছন্দ করার পক্ষে যুক্তিসঙ্গত কারণ রয়েছে: মূল্যায়ন ক্রমটি পড়ার ক্রম অনুসরণ করে।


দুর্দান্ত, সুতরাং (>>>) মূলত (|>) এর সাথে সমান?
খানজোর

@ খানজোর ঠিক নেই (|>) একটি যুক্তি প্রয়োগ করে, (>>>) বেশিরভাগ ক্ষেত্রে ফাংশন রচনা (বা অনুরূপ জিনিস)। তারপরে আমি অনুমান করি কিছু স্থিরতা পার্থক্য আছে (এটি পরীক্ষা করে নি)।
সাস্টানিন

15

আমি >>>ব্যবহার করতে দেখেছি flip (.)এবং আমি প্রায়শই এটি নিজেই ব্যবহার করি, বিশেষত দীর্ঘ চেইনের জন্য যা বাম-থেকে-ডানকে সবচেয়ে ভাল বোঝা যায়।

>>> আসলে কন্ট্রোল.আরো থেকে, এবং কেবল ফাংশনগুলির চেয়ে বেশি কাজ করে।


>>>সংজ্ঞায়িত করা হয় Control.Category
স্টিভেন শ

13

শৈলী এবং সংস্কৃতি বাদে, এটি খাঁটি বা অপবিত্র কোডের জন্য ভাষা নকশাকে অনুকূল করে তোলার জন্য উত্সাহিত করে।

|>অপারেটর এফ # খুবই সাধারণ বিষয় মূলত কারণ এটি দুই সীমাবদ্ধতা যে প্রধানত-অশুদ্ধ কোড সহ প্রদর্শিত আড়াল করতে সাহায্য করে:

  • কাঠামোগত সাব টাইপগুলি ছাড়াই বাম থেকে ডান প্রকারের অনুক্রম।
  • মান সীমাবদ্ধতা।

নোট করুন যে ওক্য্যামলে পূর্ব সীমাবদ্ধতার অস্তিত্ব নেই কারণ সাব টাইপিং নামমাত্রের পরিবর্তে কাঠামোগত, সুতরাং কাঠামোগত ধরণটি সহজেই সংহতকরণের মাধ্যমে সংশোধন করা যায় যেহেতু টাইপ অনুক্রমটি এগিয়ে যায়।

মূলত খাঁটি কোড যেখানে এই সীমাবদ্ধতাগুলি প্রত্যাহার করা যায় সেখানে ফোকাস করা বেছে নিয়ে হাস্কেল একটি আলাদা বাণিজ্য বন্ধ রাখে।


8

আমি মনে করি এফ # এর পাইপ ফরোয়ার্ড অপারেটর ( |>) হ্যাককেলে বনাম ( & ) করা উচিত ।

// pipe operator example in haskell

factorial :: (Eq a, Num a) =>  a -> a
factorial x =
  case x of
    1 -> 1
    _ -> x * factorial (x-1)
// terminal
ghic >> 5 & factorial & show

আপনি যদি ( &) অপারেটর পছন্দ না করেন তবে আপনি এফ # বা এলিক্সির মতো এটি কাস্টম করতে পারেন:

(|>) :: a -> (a -> b) -> b
(|>) x f = f x
infixl 1 |>
ghci>> 5 |> factorial |> show

কেন infixl 1 |>? ডেটা-ফাংশন (&) এ ডকটি দেখুন

infixl = infix + বাম সাহচর্য

infixr = infix + ডান সহযোগীতা


(।)

( .) অর্থ ফাংশন রচনা। এর অর্থ (fg) (x) = f (g (x)) মঠে।

foo = negate . (*3)
// ouput -3
ghci>> foo 1
// ouput -15
ghci>> foo 5

এটি সমান

// (1)
foo x = negate (x * 3) 

অথবা

// (2)
foo x = negate $ x * 3 

( $) অপারেটর ডেটা-ফাংশন ($) এও ডিফেন্ড হয় ।

( .) তৈরি করার জন্য Hight Order Functionবা ব্যবহৃত হয় closure in js। উদাহরণ দেখুন:


// (1) use lamda expression to create a Hight Order Function
ghci> map (\x -> negate (abs x)) [5,-3,-6,7,-3,2,-19,24]  
[-5,-3,-6,-7,-3,-2,-19,-24]


// (2) use . operator to create a Hight Order Function
ghci> map (negate . abs) [5,-3,-6,7,-3,2,-19,24]  
[-5,-3,-6,-7,-3,-2,-19,-24]

বাহ, কম (কোড) ভাল।


তুলনা |>এবং.

ghci> 5 |> factorial |> show

// equals

ghci> (show . factorial) 5 

// equals

ghci> show . factorial $ 5 

এটি left —> rightএবং এর মধ্যে আলাদা right —> left। ⊙﹏⊙ |||

humanization

|>এবং &চেয়ে ভাল.

কারণ

ghci> sum (replicate 5 (max 6.7 8.9))

// equals

ghci> 8.9 & max 6.7 & replicate 5 & sum

// equals

ghci> 8.9 |> max 6.7 |> replicate 5 |> sum

// equals

ghci> (sum . replicate 5 . max 6.7) 8.9

// equals

ghci> sum . replicate 5 . max 6.7 $ 8.9

কীভাবে অবজেক্ট ওরিয়েন্টেড ভাষায় ফাংশনাল প্রোগ্রামিং করবেন?

দয়া করে http://reactivex.io/ দেখুন

আইটি সমর্থন :

  • জাভা: আরএক্সজাভা
  • জাভাস্ক্রিপ্ট: আরএক্সজেএস
  • সি #: আরএক্স.এনইটি
  • সি # (ityক্য): ইউএনআরএক্স
  • স্কেল: আরএক্সস্কালা
  • ক্লোজার: আরএক্সক্লোজার
  • সি ++: আরএক্সসিপিপি
  • লুয়া: আরএক্সলুয়া
  • রুবি: আরএক্স.আরবি
  • পাইথন: আরএক্সপিওয়াই
  • যান: আরএক্সগো
  • গ্রোভী: আরএক্সগ্রোভি
  • জেআরবি: আরএক্সজেবুবি
  • কোটলিন: আরএক্সকোটলিন
  • সুইফট: আরএক্সসুইফ্ট
  • পিএইচপি: আরএক্সপিএইচপি
  • এলিক্সির: রিএ্যাকসিভ
  • ডার্ট: আরএক্সডার্ট

1

হাস্কেলের চেষ্টা করার জন্য এটি আমার প্রথম দিন (জং এবং এফ # এর পরে), এবং আমি এফ # 's |> অপারেটরটি সংজ্ঞায়িত করতে সক্ষম হয়েছি:

(|>) :: a -> (a -> b) -> b
(|>) x f = f x
infixl 0 |>

এবং এটা কাজ মনে হয়:

factorial x =
  case x of
    1 -> 1
    _ -> x * factorial (x-1)

main =     
    5 |> factorial |> print

আমি বাজি ধরছি একজন হাস্কেল বিশেষজ্ঞ আপনাকে আরও একটি ভাল সমাধান দিতে পারে।


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