হাস্কেল প্রিলিওডের মাধ্যমে সন্ধান করে আমি একটি ফাংশন দেখতে পাচ্ছি const
:
const x _ = x
আমি এই ফাংশন সম্পর্কিত প্রাসঙ্গিক কিছু খুঁজে পেতে পারে না।
আলোচ্য বিষয়টি কি? এই ফাংশনটি কোথায় ব্যবহৃত হতে পারে তার উদাহরণ কেউ দিতে পারেন?
হাস্কেল প্রিলিওডের মাধ্যমে সন্ধান করে আমি একটি ফাংশন দেখতে পাচ্ছি const
:
const x _ = x
আমি এই ফাংশন সম্পর্কিত প্রাসঙ্গিক কিছু খুঁজে পেতে পারে না।
আলোচ্য বিষয়টি কি? এই ফাংশনটি কোথায় ব্যবহৃত হতে পারে তার উদাহরণ কেউ দিতে পারেন?
উত্তর:
যখন আপনার সমস্ত নমনীয়তার প্রয়োজন হয় না তখন এটি উচ্চ-অর্ডার ফাংশনে যাওয়ার জন্য কার্যকর। উদাহরণস্বরূপ, monadic সিকোয়েন্স >>
অপারেটর হিসাবে monadic বাইন্ড অপারেটরের হিসাবে সংজ্ঞায়িত করা যেতে পারে
x >> y = x >>= const y
এটি ল্যাম্বডা ব্যবহারের চেয়ে কিছুটা কম
x >> y = x >>= \_ -> y
এবং আপনি এটি বিন্দু মুক্ত ব্যবহার করতে পারেন
(>>) = (. const) . (>>=)
যদিও আমি বিশেষত এই ক্ষেত্রে সুপারিশ করি না।
map (const 42) [1..5]
ফলাফল [42, 42, 42, 42, 42]
।
const
যেখানে কোনও প্রয়োজন হয় এমন ফাংশনটি উত্পাদন করতে একক যুক্তিতে প্রয়োগ করার জন্য দরকারী (যেমন পাস করা map
)।
head = foldr const (error "Prelude.head: empty list")
Hammar এর চমৎকার সরাসরি উত্তর জুড়তে: নম্র ফাংশন পছন্দ const
এবং id
একই কারণে যে, তারা তাদের জন্য একটি উচ্চ অর্ডার ফাংশন হিসাবে সত্যিই দরকারী হয় মৌলিক মধ্যে স্কি combinator ক্যালকুলাস ।
এমনটি নয় যে আমি মনে করি যে হ্যাশেলের প্রিলেড ফাংশনগুলি সেই আনুষ্ঠানিক ব্যবস্থা বা যে কোনও কিছুর পরে সচেতনভাবে মডেল করা হয়েছিল। এটি ঠিক যে হ্যাশকেলে সমৃদ্ধ বিমূর্ততা তৈরি করা খুব সহজ, তাই আপনি প্রায়শই এই ধরণের তাত্ত্বিক বিষয়গুলি ব্যবহারিকভাবে কার্যকর হিসাবে উপস্থিত হতে দেখেন।
লজ্জাহীন প্লাগ, কিন্তু আমি কিভাবে জন্য আবেদন উদাহরণস্বরূপ ব্লগ (->)
আসলে S
এবং K
combinators এখানে যে, যদি জিনিস ধরনের আপনার চারপাশের সবকিছু আছে।
((->) e)
এছাড়াও পাঠক মনাদ - সাথে Reader
এবং ঠিক যেমন newtype
মোড়ক দেওয়া - এবং ask
ফাংশনটি তখন id
, তাই এটি I
সংযুক্তিটিও। আপনি Haskell, কারি মূল BCKW ভিত্তিতে এ পরিবর্তে তাকান, B
, K
, এবং W
হয় fmap
, return
এবং join
যথাক্রমে।
ব্যবহার করার জন্য একটি উত্তম উদাহরণ const
হল Data.Functor.(<$)
। এই ফাংশনটির সাহায্যে আপনি বলতে পারেন: আমার কাছে এখানে কিছু বিরক্তিকর সঙ্গে একটি ফান্টার রয়েছে, তবে পরিবর্তে আমি এটির অন্যান্য আকর্ষণীয় জিনিসটি ফান্টারের আকৃতি পরিবর্তন না করেই রাখতে চাই। যেমন
import Data.Functor
42 <$ Just "boring"
--> Just 42
42 <$ Nothing
--> Nothing
"cool" <$ ["nonsense","stupid","uninteresting"]
--> ["cool","cool","cool"]
সংজ্ঞাটি হ'ল:
(<$) :: a -> f b -> f a
(<$) = fmap . const
বা অর্থহীন হিসাবে লিখিত:
cool <$ uncool = fmap (const cool) uncool
আপনি দেখতে পাবেন কীভাবে const
এখানে ইনপুট সম্পর্কে "ভুলে" যেতে ব্যবহৃত হয়।
আমি এই ফাংশন সম্পর্কিত প্রাসঙ্গিক কিছু খুঁজে পেতে পারে না।
অন্যান্য উত্তরগুলির মধ্যে অনেকগুলি অপেক্ষাকৃত গুপ্ত (কমপক্ষে নতুনদের কাছে) অ্যাপ্লিকেশনগুলি নিয়ে আলোচনা করে const
। এখানে একটি সরল একটি: আপনি const
দুটি লম্বা যুক্তিযুক্ত একটি ল্যাম্বদা থেকে মুক্তি পেতে ব্যবহার করতে পারেন , প্রথমটিকে দূরে ফেলে দেন তবে দ্বিতীয়টির সাথে আকর্ষণীয় কিছু করেন।
উদাহরণস্বরূপ, নিম্নলিখিত (অকার্যকর তবে শিক্ষামূলক) বাস্তবায়ন length
,
length' = foldr (\_ acc -> 1 + acc) 0
হিসাবে আবার লিখতে পারেন
length' = foldr (const (1+)) 0
যা সম্ভবত আরও মার্জিত।
অভিব্যক্তিটি const (1+)
প্রকৃতপক্ষে শব্দার্থগতভাবে সমান \_ acc -> 1 + acc
, কারণ এটি একটি যুক্তি নেয়, এটিকে ছুঁড়ে ফেলে এবং বিভাগটি ফেরত দেয় (1+)
।
আরেকটি ব্যবহার হ'ল শ্রেণীর সদস্য ক্রিয়াকলাপগুলি বাস্তবায়িত করা যাতে ডামি যুক্তি থাকে যা মূল্যায়ন করা উচিত নয় (অস্পষ্ট ধরণের সমাধানের জন্য ব্যবহৃত হয়)। ডেটা.বিটে থাকতে পারে এমন উদাহরণ:
instance Bits Int where
isSigned = const True
bitSize = const wordSize
...
কনস্ট ব্যবহার করে আমরা স্পষ্টভাবে বলতে পারি যে আমরা ধ্রুবক মানগুলি সংজ্ঞায়িত করছি।
ব্যক্তিগতভাবে আমি ডামি প্যারামিটারগুলির ব্যবহারকে অপছন্দ করি, তবে সেগুলি যদি কোনও শ্রেণিতে ব্যবহৃত হয় তবে উদাহরণগুলি লেখার এটি একটি দুর্দান্ত উপায়।
const
অন্যান্য ক্রিয়াকলাপগুলির সাথে একত্রে আপনি যা খুঁজছেন তা কেবল বাস্তবায়ন হতে পারে। আমি আবিষ্কার করেছি একটি উদাহরণ এখানে।
বলুন আমরা 2-টিপলসের একটি কাঠামোকে 2-টিপলসের অন্য কাঠামোতে আবার লিখতে চাই। আমি এটি তাই প্রকাশ করতে পারেন:
((a,b),(c,d)) ⇒ (a,(c,(5,a)))
আমি প্যাটার্ন মিলের সাথে একটি সোজা-ফরোয়ার্ড সংজ্ঞা দিতে পারি:
f ((a,b),(c,d)) = (a,(c,(5,a)))
যদি আমি এই জাতীয় পুনর্লিখনের জন্য একটি অর্থহীন (স্বতন্ত্র) সমাধান চাই? কিছু চিন্তাভাবনা এবং মূর্খতা পরে, উত্তরটি হ'ল আমরা যে কোনও রচনা লিখতে পারি (&&&), const, (.), fst, snd
। নোট যে (&&&)
থেকে Control.Arrow
।
এই ফাংশনগুলি ব্যবহার করে উদাহরণটির সমাধানটি হ'ল:
(fst.fst &&& (fst.snd &&& (const 5 &&& fst.fst)))
এর সাথে মিলটি নোট করুন (a,(c,(5,a)))
। আমরা যদি এর &&&
সাথে প্রতিস্থাপন করব ,
? তারপরে এটি পড়ে:
(fst.fst, (fst.snd, (const 5, fst.fst)))
a
প্রথম উপাদানটির প্রথম উপাদানটি কীভাবে তা লক্ষ্য করুন এবং এটিই fst.fst
প্রকল্পগুলি। c
দ্বিতীয় উপাদানটির প্রথম উপাদানটি কীভাবে লক্ষ্য করুন এবং এটিই fst.snd
প্রকল্পগুলি। অর্থাত্ ভেরিয়েবলগুলি তাদের উত্সের পথে পরিণত হয়।
const
আমাদের ধ্রুবক পরিচয় করিয়ে দেয়। আকর্ষণীয় কীভাবে নামের সাথে মিল রয়েছে!
আমি তখন আবেদন সঙ্গে এই ধারণা সাধারণ যাতে আপনি একটি অর্থহীন শৈলী যে কোন ফাংশন লিখতে পারেন (তাই যতদিন আপনি যদি বিশ্লেষণ যেমন ফাংশন, হিসাবে উপলব্ধ আছে maybe
, either
, bool
)। আবার, const
ধ্রুবকগুলি পরিচয় করানোর ভূমিকা পালন করে। আপনি এই কাজটি ডেটা ফাংশন.ট্যাসিট প্যাকেজে দেখতে পারেন ।
আপনি যখন বিমূর্তভাবে, লক্ষ্যে, এবং তারপরে একটি বাস্তবায়নের দিকে কাজ শুরু করেন, তখন আপনি উত্তরগুলি দেখে অবাক হয়ে যেতে পারেন। এর অর্থ, যেকোন একটি ফাংশন মেশিনের যে কোনও একটি কগের মতো রহস্যময় হতে পারে। আপনি যদি পুরো মেশিনটিকে নজরে আনার জন্য পিছনে টানেন তবে আপনি যে প্রেক্ষাপটে সেই কগটি প্রয়োজনীয় তা বুঝতে পারবেন।
বলুন আপনি Nothings
কোনও স্ট্রিংয়ের দৈর্ঘ্যের সমান একটি তালিকা তৈরি করতে চান । const
এটির প্রথম যুক্তি যেমন ফেরত দেয়, দ্বিতীয় বিষয়টি বিবেচনা না করে আপনি এটি করতে পারেন:
listOfNothings :: String -> [Maybe Char]
listOfNothings = (map . const) Nothing
বা, আরও স্পষ্টভাবে:
listOfNothing st = map (const Nothing) st
বলুন আপনি একটি তালিকা ঘোরান। হাস্কেলতে এটি করার একটি মূio় উপায়:
rotate :: Int -> [a] -> [a]
rotate _ [] = []
rotate n xs = zipWith const (drop n (cycle xs)) xs
এই ফাংশনটি ফাংশনটির সাথে দুটি অ্যারে জিপ করে const
, প্রথমটি হ'ল অসীম চক্রীয় অ্যারে, দ্বিতীয়টি আপনি শুরু করেছিলেন এমন অ্যারে।
const
সীমা পরীক্ষা হিসাবে কাজ করে, এবং চক্রাকার অ্যারে বন্ধ করতে আসল অ্যারে ব্যবহার করে।
দেখুন: হাসকেলে একটি তালিকা ঘোরান
আমি এই ফাংশন সম্পর্কিত প্রাসঙ্গিক কিছু খুঁজে পেতে পারে না।
মনে করুন আপনি প্রদত্ত তালিকার সমস্ত অনুচ্ছেদ তৈরি করতে চান।
প্রতিটি তালিকার উপাদানগুলির জন্য, একটি নির্দিষ্ট বিন্দুতে আপনার কাছে সত্যের একটি পছন্দ থাকে (এটি বর্তমান অনুচ্ছেদে অন্তর্ভুক্ত করুন) বা মিথ্যা (এটি অন্তর্ভুক্ত করবেন না)। এটি ফিল্টারএম ফাংশন ব্যবহার করে করা যেতে পারে ।
এটার মত:
λ> import Control.Monad
λ> :t filterM
filterM :: Applicative m => (a -> m Bool) -> [a] -> m [a]
λ>
উদাহরণস্বরূপ, আমরা সমস্ত অনুচ্ছেদ চাই [1..4]
।
λ> filterM (const [True, False]) [1..4]
[[1,2,3,4],[1,2,3],[1,2,4],[1,2],[1,3,4],[1,3],[1,4],[1],[2,3,4],[2,3],[2,4],[2],[3,4],[3],[4],[]]
λ>
backgroundColor :: Text -> Color
আমার জন্যbackgroundColor = const White