উত্তর:
আমি একটু জল্পনা করা হচ্ছে ...
সংস্কৃতি : আমি মনে করি |>
এফ # "সংস্কৃতি" এর একটি গুরুত্বপূর্ণ অপারেটর এবং সম্ভবত একইভাবে .
হাস্কেলের পক্ষেও রয়েছে। এফ # এর একটি ফাংশন কম্পোজিশন অপারেটর রয়েছে <<
তবে আমি মনে করি এফ # সম্প্রদায় হাস্কেল সম্প্রদায়ের তুলনায় পয়েন্টমুক্ত স্টাইল ব্যবহার করতে ঝোঁক ।
ভাষার পার্থক্য : তুলনা করার জন্য আমি উভয় ভাষারই যথেষ্ট জানি না, তবে লেট-বাইন্ডিংগুলিকে সাধারণীকরণের নিয়মগুলি এটিকে প্রভাবিত করার জন্য যথেষ্ট আলাদা। উদাহরণস্বরূপ, আমি F # তে কখনও কখনও লিখতে জানি
let f = exp
সংকলন করবে না এবং আপনার স্পষ্টত এটা-রূপান্তর দরকার:
let f x = (exp) x // or x |> exp
এটি সংকলন করতে। এটি লোককে বিন্দু মুক্ত / রচনাশৈলীর থেকে এবং পাইপলাইং স্টাইলের দিকে দূরে সরিয়ে দেয়। এছাড়াও, এফ # টাইপ অনুমান কখনও কখনও পাইপলাইনের দাবি করে, যাতে একটি পরিচিত প্রকারটি বাম দিকে উপস্থিত হয় ( এখানে দেখুন )।
(ব্যক্তিগতভাবে আমি পয়েন্ট-মুক্ত শৈলীটি অপঠনযোগ্য দেখতে পেয়েছি তবে আমি মনে করি প্রতিটি নতুন / ভিন্ন জিনিস অপরিশোধনযোগ্য বলে মনে হয় যতক্ষণ না আপনি এটি অভ্যস্ত হয়ে পড়েছেন))
আমি মনে করি যে উভয়ই উভয় ভাষায়ই সম্ভাব্য কার্যকর এবং ইতিহাস / সংস্কৃতি / দুর্ঘটনা সংজ্ঞায়িত করতে পারে যে কেন প্রতিটি সম্প্রদায় আলাদা "আকর্ষক" এ বসেছে।
.
এবং $
তাই লোকেরা সেগুলি ব্যবহার চালিয়ে যায়।
(|>)
বাম থেকে ডান টাইপচেকিংয়ের কারণে এফ # তে গুরুত্বপূর্ণ। উদাহরণ স্বরূপ:
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
দেখা হয়েছে এবং এই প্রয়োজনীয়তা সমাধান করা যেতে পারে। যদিও এটি টাইপ সিস্টেমটিকে জটিল করে তোলে।
আরও জল্পনা, এবার প্রধানত হাস্কেল পক্ষ থেকে ...
($)
(|>)
আপনি যখন পয়েন্ট-ফ্রি কোড লিখতে না পারেন তখন এটির ফ্লিপ এবং এর ব্যবহার বেশ সাধারণ। সুতরাং (|>)
হাস্কেলটিতে ব্যবহৃত না হওয়ার মূল কারণটি হ'ল এর জায়গাটি ইতিমধ্যে নেওয়া হয়েছে ($)
।
এছাড়াও, কিছুটা F # অভিজ্ঞতা থেকে কথা বললে, আমি মনে করি (|>)
এফ # কোডে এত জনপ্রিয় কারণ এটি ওওর Subject.Verb(Object)
কাঠামোর সাথে সাদৃশ্যপূর্ণ । যেহেতু এফ # একটি মসৃণ ক্রিয়ামূলক / ওও সংহতকরণের লক্ষ্যে রয়েছে তাই Subject |> Verb Object
নতুন কার্যনির্বাহী প্রোগ্রামারদের জন্য বেশ মসৃণ রূপান্তর।
ব্যক্তিগতভাবে, আমি বাম-থেকে-ডানদিকেও ভাবতে পছন্দ করি, তাই আমি (|>)
হাসকেলে ব্যবহার করি, তবে আমি মনে করি না যে আরও অনেক লোক তা করেন।
Data.Sequence.|>
, তবে $>
সেখানে বিরোধগুলি এড়াতে যুক্তিসঙ্গত মনে হচ্ছে। সত্যিই, কেবলমাত্র অনেকগুলি সুদর্শন অপারেটর রয়েছে, তাই আমি কেবল |>
উভয়ের জন্য ব্যবহার করব এবং কেস-কেস-কেস ভিত্তিতে বিরোধগুলি পরিচালনা করব। (এছাড়াও আমি কেবল ওরফে Data.Sequence.|>
হিসাবে প্রলুব্ধ হবে snoc
)
($)
এবং (|>)
অ্যাপ্লিকেশনটি রচনা নয়। দুটি (প্রশ্ন নোট হিসাবে) সম্পর্কিত হয় কিন্তু তারা একই হয় না (আপনার fc
হয় (Control.Arrow.>>>)
ফাংশন জন্য)।
|>
আসলে আমাকে |
অন্য কোনও কিছুর চেয়ে ইউনিক্সের কথা মনে করিয়ে দেয় ।
|>
এফ # এর আরও একটি সুবিধা হ'ল ভিজ্যুয়াল স্টুডিওতে ইন্টেলিসেন্সের জন্য এটির দুর্দান্ত বৈশিষ্ট্য রয়েছে। টাইপ করুন |>
, এবং আপনি কোনও ফাংশনের একটি তালিকা পাবেন যা .
কোনও বস্তুর পরে টাইপ করার সময় যা ঘটে তার অনুরূপ বাম দিকের মানটিতে প্রয়োগ করা যেতে পারে ।
আমি মনে করি আমরা বিভ্রান্তিকর জিনিস। হাস্কেলের ( .
) 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
$
অপারেটর - বিপরীত, এছাড়াও আপনি সহজেই এটি সংজ্ঞায়িত করতে: a |> b = flip ($)
যা এফ # 's করা পাইপলাইন সমতুল্য হয়ে তারপর আপনি কি করতে পারেন EG[1..10] |> map f
.
) ( ) হিসাবে একই <<
, অন্যদিকে ( >>
) বিপরীত রচনা। এটি ( >> ) : ('T1 -> 'T2) -> ('T2 -> 'T3) -> 'T1 -> 'T3
বনাম( << ) : ('T2 -> 'T3) -> ('T1 -> 'T2) -> 'T1 -> 'T3
.
সমতুল্য বলে মনে করি না >>
। আমি জানি না যে এফ # এর আছে কিনা <<
তবে এটি সমান হবে (এলমের মতো)।
আপনি এফ # ব্যবহার করতে চান তাহলে 's |>
মধ্যে Haskell তারপর Data.Function হয় &
(যেহেতু অপারেটর base 4.8.0.0
)।
&
নেওয়ার কোনও কারণ |>
? আমি মনে করি |>
এটি অনেক বেশি স্বজ্ঞাত এবং এটি আমাকে ইউনিক্স পাইপ অপারেটরের স্মরণ করিয়ে দেয়।
কিছু লোক হাস্কেলতেও বাম থেকে ডান (বার্তা-পাসিং) স্টাইল ব্যবহার করে। দেখুন, উদাহরণস্বরূপ, এমপিদের 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]
কখনও কখনও বাম থেকে ডান রচনাটি পছন্দ করার পক্ষে যুক্তিসঙ্গত কারণ রয়েছে: মূল্যায়ন ক্রমটি পড়ার ক্রম অনুসরণ করে।
আমি >>>
ব্যবহার করতে দেখেছি flip (.)
এবং আমি প্রায়শই এটি নিজেই ব্যবহার করি, বিশেষত দীর্ঘ চেইনের জন্য যা বাম-থেকে-ডানকে সবচেয়ে ভাল বোঝা যায়।
>>>
আসলে কন্ট্রোল.আরো থেকে, এবং কেবল ফাংশনগুলির চেয়ে বেশি কাজ করে।
>>>
সংজ্ঞায়িত করা হয় Control.Category
।
শৈলী এবং সংস্কৃতি বাদে, এটি খাঁটি বা অপবিত্র কোডের জন্য ভাষা নকশাকে অনুকূল করে তোলার জন্য উত্সাহিত করে।
|>
অপারেটর এফ # খুবই সাধারণ বিষয় মূলত কারণ এটি দুই সীমাবদ্ধতা যে প্রধানত-অশুদ্ধ কোড সহ প্রদর্শিত আড়াল করতে সাহায্য করে:
নোট করুন যে ওক্য্যামলে পূর্ব সীমাবদ্ধতার অস্তিত্ব নেই কারণ সাব টাইপিং নামমাত্রের পরিবর্তে কাঠামোগত, সুতরাং কাঠামোগত ধরণটি সহজেই সংহতকরণের মাধ্যমে সংশোধন করা যায় যেহেতু টাইপ অনুক্রমটি এগিয়ে যায়।
মূলত খাঁটি কোড যেখানে এই সীমাবদ্ধতাগুলি প্রত্যাহার করা যায় সেখানে ফোকাস করা বেছে নিয়ে হাস্কেল একটি আলাদা বাণিজ্য বন্ধ রাখে।
আমি মনে করি এফ # এর পাইপ ফরোয়ার্ড অপারেটর ( |>
) হ্যাককেলে বনাম ( & ) করা উচিত ।
// 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
। ⊙﹏⊙ |||
|>
এবং &
চেয়ে ভাল.
কারণ
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/ দেখুন
আইটি সমর্থন :
হাস্কেলের চেষ্টা করার জন্য এটি আমার প্রথম দিন (জং এবং এফ # এর পরে), এবং আমি এফ # '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
আমি বাজি ধরছি একজন হাস্কেল বিশেষজ্ঞ আপনাকে আরও একটি ভাল সমাধান দিতে পারে।
x |> f = f x
&
এটি হাস্কেলের|>
। এই থ্রেডে গভীরভাবে কবর দেওয়া হয়েছে এবং আমাকে আবিষ্কার করতে কয়েক দিন সময় নিল। আমি এটি প্রচুর ব্যবহার করি কারণ আপনি আপনার কোডটি অনুসরণ করতে স্বাভাবিকভাবে বাম থেকে ডানদিকে পড়েন।