হাস্কেল প্রিলিওডে 'কনস্ট' এর বিন্দুটি কী?


94

হাস্কেল প্রিলিওডের মাধ্যমে সন্ধান করে আমি একটি ফাংশন দেখতে পাচ্ছি const :

const x _ = x

আমি এই ফাংশন সম্পর্কিত প্রাসঙ্গিক কিছু খুঁজে পেতে পারে না।

আলোচ্য বিষয়টি কি? এই ফাংশনটি কোথায় ব্যবহৃত হতে পারে তার উদাহরণ কেউ দিতে পারেন?


10
একটি উদাহরণ: backgroundColor :: Text -> Colorআমার জন্যbackgroundColor = const White
ঝেন

উত্তর:


84

যখন আপনার সমস্ত নমনীয়তার প্রয়োজন হয় না তখন এটি উচ্চ-অর্ডার ফাংশনে যাওয়ার জন্য কার্যকর। উদাহরণস্বরূপ, monadic সিকোয়েন্স >>অপারেটর হিসাবে monadic বাইন্ড অপারেটরের হিসাবে সংজ্ঞায়িত করা যেতে পারে

x >> y = x >>= const y

এটি ল্যাম্বডা ব্যবহারের চেয়ে কিছুটা কম

x >> y = x >>= \_ -> y

এবং আপনি এটি বিন্দু মুক্ত ব্যবহার করতে পারেন

(>>) = (. const) . (>>=)

যদিও আমি বিশেষত এই ক্ষেত্রে সুপারিশ করি না।


9
+1 পার্সার সংযুক্তকারীগুলি ব্যবহার করার সময় এটি প্রায়শই আসে।
ফ্রেড ফু

49
আহ তাই এটি একটি আরও বেশি 'ফাংশন জেনারেটর' - আমি এটি একটি যুক্তি দিয়ে ব্যবহার করি এবং এটি আমাকে একটি ফাংশন দেয় (একটি যুক্তি গ্রহণ করে) যা সর্বদা স্থির মান দেয়। সুতরাং map (const 42) [1..5]ফলাফল [42, 42, 42, 42, 42]
stusmith

4
বুদ্ধিমান: আপনি এটি পেয়েছেন। constযেখানে কোনও প্রয়োজন হয় এমন ফাংশনটি উত্পাদন করতে একক যুক্তিতে প্রয়োগ করার জন্য দরকারী (যেমন পাস করা map)।
কনল

9
@ স্টাম্মিথ: আপনি এটি কিছু আকর্ষণীয় উপায়ে ব্যবহার করতে পারেন:head = foldr const (error "Prelude.head: empty list")
রায়পম্পান

27

Hammar এর চমৎকার সরাসরি উত্তর জুড়তে: নম্র ফাংশন পছন্দ constএবং idএকই কারণে যে, তারা তাদের জন্য একটি উচ্চ অর্ডার ফাংশন হিসাবে সত্যিই দরকারী হয় মৌলিক মধ্যে স্কি combinator ক্যালকুলাস

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

লজ্জাহীন প্লাগ, কিন্তু আমি কিভাবে জন্য আবেদন উদাহরণস্বরূপ ব্লগ (->)আসলে Sএবং Kcombinators এখানে যে, যদি জিনিস ধরনের আপনার চারপাশের সবকিছু আছে।


8
ঠিক আছে, এসকেআই সংযুক্তকারীরা অবশ্যই প্রিলিউডকে প্রভাবিত করেছিল। আমার মনে আছে জো ফ্যাসেলের সাথে তর্ক করা যদি এস সংযুক্তকারীকে অন্তর্ভুক্ত করা উচিত বা না করা উচিত।
আগস্ট

4
ঘটনাচক্রে, ((->) e)এছাড়াও পাঠক মনাদ - সাথে Readerএবং ঠিক যেমন newtypeমোড়ক দেওয়া - এবং askফাংশনটি তখন id, তাই এটি Iসংযুক্তিটিও। আপনি Haskell, কারি মূল BCKW ভিত্তিতে এ পরিবর্তে তাকান, B, K, এবং Wহয় fmap, returnএবং joinযথাক্রমে।
সিএ ম্যাকক্যান

4
উত্তরে ব্লগের লিঙ্কটি মারা গেছে। এটি এখন এখানে উল্লেখ করা উচিত: brandon.si/code/…
nsxt

22

ব্যবহার করার জন্য একটি উত্তম উদাহরণ 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এখানে ইনপুট সম্পর্কে "ভুলে" যেতে ব্যবহৃত হয়।


21

আমি এই ফাংশন সম্পর্কিত প্রাসঙ্গিক কিছু খুঁজে পেতে পারে না।

অন্যান্য উত্তরগুলির মধ্যে অনেকগুলি অপেক্ষাকৃত গুপ্ত (কমপক্ষে নতুনদের কাছে) অ্যাপ্লিকেশনগুলি নিয়ে আলোচনা করে const। এখানে একটি সরল একটি: আপনি constদুটি লম্বা যুক্তিযুক্ত একটি ল্যাম্বদা থেকে মুক্তি পেতে ব্যবহার করতে পারেন , প্রথমটিকে দূরে ফেলে দেন তবে দ্বিতীয়টির সাথে আকর্ষণীয় কিছু করেন।

উদাহরণস্বরূপ, নিম্নলিখিত (অকার্যকর তবে শিক্ষামূলক) বাস্তবায়ন length,

length' = foldr (\_ acc -> 1 + acc) 0

হিসাবে আবার লিখতে পারেন

length' = foldr (const (1+)) 0

যা সম্ভবত আরও মার্জিত।

অভিব্যক্তিটি const (1+)প্রকৃতপক্ষে শব্দার্থগতভাবে সমান \_ acc -> 1 + acc, কারণ এটি একটি যুক্তি নেয়, এটিকে ছুঁড়ে ফেলে এবং বিভাগটি ফেরত দেয় (1+)


4
এটি কীভাবে কাজ করে তা বুঝতে আমার 5 মিনিট সময় লেগেছে :)
মুকেশ সনি

15

আরেকটি ব্যবহার হ'ল শ্রেণীর সদস্য ক্রিয়াকলাপগুলি বাস্তবায়িত করা যাতে ডামি যুক্তি থাকে যা মূল্যায়ন করা উচিত নয় (অস্পষ্ট ধরণের সমাধানের জন্য ব্যবহৃত হয়)। ডেটা.বিটে থাকতে পারে এমন উদাহরণ:

instance Bits Int where
  isSigned = const True
  bitSize  = const wordSize
  ...

কনস্ট ব্যবহার করে আমরা স্পষ্টভাবে বলতে পারি যে আমরা ধ্রুবক মানগুলি সংজ্ঞায়িত করছি।

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


প্রক্সি যুক্তিগুলি প্রকৃতপক্ষে আরও ভাল এবং সাম্প্রতিক জিএইচসি লক্ষ্য করে যখন টাইপ অ্যাপ্লিকেশনগুলি ঝুঁকির সাথে কৌশল করে।
dfeuer

2

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ধ্রুবকগুলি পরিচয় করানোর ভূমিকা পালন করে। আপনি এই কাজটি ডেটা ফাংশন.ট্যাসিট প্যাকেজে দেখতে পারেন ।

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


2

বলুন আপনি Nothingsকোনও স্ট্রিংয়ের দৈর্ঘ্যের সমান একটি তালিকা তৈরি করতে চান । constএটির প্রথম যুক্তি যেমন ফেরত দেয়, দ্বিতীয় বিষয়টি বিবেচনা না করে আপনি এটি করতে পারেন:

listOfNothings :: String -> [Maybe Char]
listOfNothings = (map . const) Nothing

বা, আরও স্পষ্টভাবে:

listOfNothing st = map (const Nothing) st

0

বলুন আপনি একটি তালিকা ঘোরান। হাস্কেলতে এটি করার একটি মূio় উপায়:

rotate :: Int -> [a] -> [a] rotate _ [] = [] rotate n xs = zipWith const (drop n (cycle xs)) xs

এই ফাংশনটি ফাংশনটির সাথে দুটি অ্যারে জিপ করে const, প্রথমটি হ'ল অসীম চক্রীয় অ্যারে, দ্বিতীয়টি আপনি শুরু করেছিলেন এমন অ্যারে।

const সীমা পরীক্ষা হিসাবে কাজ করে, এবং চক্রাকার অ্যারে বন্ধ করতে আসল অ্যারে ব্যবহার করে।

দেখুন: হাসকেলে একটি তালিকা ঘোরান


0

আমি এই ফাংশন সম্পর্কিত প্রাসঙ্গিক কিছু খুঁজে পেতে পারে না।

মনে করুন আপনি প্রদত্ত তালিকার সমস্ত অনুচ্ছেদ তৈরি করতে চান।

প্রতিটি তালিকার উপাদানগুলির জন্য, একটি নির্দিষ্ট বিন্দুতে আপনার কাছে সত্যের একটি পছন্দ থাকে (এটি বর্তমান অনুচ্ছেদে অন্তর্ভুক্ত করুন) বা মিথ্যা (এটি অন্তর্ভুক্ত করবেন না)। এটি ফিল্টারএম ফাংশন ব্যবহার করে করা যেতে পারে ।

এটার মত:

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