কেন হাস্কেলের প্রিলিওড? পঠন সম্ভবত ফিরে আসবে না?


108

প্রিলেড.আডের ধরণ হওয়ার কোনও ভাল কারণ আছে কি?

read :: Read a => String -> a

Maybeমান বদলে ?

read :: Read a => String -> Maybe a

যেহেতু স্ট্রিংটি পার্সেবল হ্যাস্কেল হতে ব্যর্থ হতে পারে, তাই আধুনিকটি কি আর স্বাভাবিক হবে না?

বা এমনকি একটি Either String a, যেখানে Leftএটি বিশ্লেষণ না করা হলে মূল স্ট্রিংটি থাকতে পারে, এবং Rightফলাফলটি যদি তা করে?

সম্পাদনা:

আমি অন্যকে আমার জন্য অনুরূপ র‌্যাপার লেখার চেষ্টা করি না। এটি আশ্বাসে নিরাপদ যে এটি করা নিরাপদ seeking


14
কেন কিছু takeমানছে না Num a => a? fmapতালিকার জন্য কেন একটি বিশেষ মামলা রয়েছে ? উদাহরণগুলির Functorজন্য কেন প্রয়োজন হয় না Monad? আমি আশা করি উত্তরগুলি এই এবং সম্পর্কিত প্রশ্নের উত্তরগুলির সাথে সমান হবে similar

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

আমি আশা করি a readMaybe শিগগিরই ফাংশন যুক্ত হবে।
augustss

ভাল পয়েন্ট @delnan কিন্তু করা উচিত নয় takeহতে Integral n => n -> [a] -> [a]?
ডগ ম্যাকক্লিয়ান

@ ডউগ এমসি ক্লিন: হ্যাঁ, এটি আসলে হওয়া উচিত Integral , Numমস্তিষ্কের

উত্তর:


106

সম্পাদনা : GHC 7.6 পর্যন্ত readMaybeপাওয়া যায় Text.Read, বেস প্যাকেজের মধ্যে মডিউল সহ readEither: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v: readMaybe


দুর্দান্ত প্রশ্ন! পড়ার ধরণ নিজেই যে কোনও সময় শীঘ্রই পরিবর্তিত হচ্ছে না কারণ এটি প্রচুর জিনিসকে ভেঙে দেবে। তবে, একটি ফাংশন থাকতে হবে maybeRead

কেন নেই? উত্তরটি "জড়তা"। '08-তে একটি আলোচনা ছিল যা "ব্যর্থ" শীর্ষক একটি আলোচনার মাধ্যমে পদত্যাগ করে।

সুসংবাদটি হ'ল লোকেরা গ্রন্থাগারগুলিতে ব্যর্থতা থেকে দূরে সরে যেতে শুরু করার পক্ষে যথেষ্ট দৃ convinced়প্রত্যয়ী ছিল। খারাপ খবর হ'ল প্রস্তাবটি বদলে গেল। এ জাতীয় একটি ফাংশন থাকতে হবে, যদিও এটি লিখতে সহজ (এবং এখানে অনেক মিলিয়ন মিলিয়ন মিলিয়ন সংস্করণ রয়েছে অনেকগুলি কোডবেসের চারপাশে)।

আরও দেখুন এই আলোচনা

ব্যক্তিগতভাবে, আমি নিরাপদ প্যাকেজ থেকে সংস্করণটি ব্যবহার করি ।


30

হ্যাঁ, এটি একটি পঠন ফাংশনটির সাথে কার্যকর হবে যা সম্ভবত ফিরে আসে। আপনি নিজের একটি তৈরি করতে পারেন:

readMaybe :: (Read a) => String -> Maybe a
readMaybe s = case reads s of
              [(x, "")] -> Just x
              _ -> Nothing

3
ধন্যবাদ! আমি আশা করি সম্পাদনাটি অকৃতজ্ঞ হবে না! :) শুধু এটুকু পরিষ্কার করতে চাই যে আমি অলসতার জন্য জিজ্ঞাসা করছি না ...
বিলাল বারাকাত

6
যদি @ অগাস্টসগুলি এটি সরবরাহ করতে না পারে তবে এর চেয়ে ভাল উত্তর নাও থাকতে পারে।
জন এল

2
আমি মনে করি না সম্ভবত কোনও সংস্করণ মূল নকশায় কখনও আলোচনা করা হয়েছিল। এগুলির অনেক কিছুই অভিজ্ঞতার সাথে সুস্পষ্ট হয়ে ওঠে তবে ভবিষ্যদ্বাণী করা কঠিন।
augustss

কারণ যে আয় একটি তালিকা সার্চ ক্ষেত্রে যেখানে একাধিক বৈধ পার্স আছে জন্য। হতে পারে কেসটি পড়তে এবং পড়ার মধ্যে মধ্যবর্তী হয়।
ক্রিস কুকলিউইচ

আমি মনে করি Read aএটির জন্য টাইপক্লাস দরকার :readMaybe :: Read a => String -> Maybe a
ডেভিড টেচপাক

15

জড়তা এবং / বা পরিবর্তন অন্তর্দৃষ্টি ছাড়াও অন্য কারণ হতে পারে যে এটি এমন একটি ফাংশন যা একটি ধরণের বিপরীত হিসাবে কাজ করতে পারে তা নান্দনিকভাবেই সন্তুষ্ট show। এটি হ'ল, আপনি read . showএটিই পরিচয়টি চান (এমন ধরণের জন্য যা উদাহরণস্বরূপ Showএবং Read) এবং এটি show . readহ'ল সীমার মধ্যে পরিচয় showieshow . read . show == show )

হচ্ছে একটি Maybe এ ধরণের readবিরতি সহ প্রতিসাম্য show :: a -> String


একটি নতুন কোণ যুক্ত করার জন্য ধন্যবাদ! এটা বোধগম্য. তবে পরিষ্কারভাবে এটি অর্জন করতে, "পার্সেবল স্ট্রিং" বলুন, শো এবং পঠন উভয়ই একটি পৃথক প্রকারের উত্পাদন করা কি বোধগম্য হবে না?
বিলাল বারাকাত

1
@ বিলাল বারাকাত: স্বতন্ত্র প্রকার হতে পারে newtype ValidShow a = ValidShow String। ফ্যান্টম টাইপ এটিকে আরও টাইপ-সেফ করে তোলে।
ইয়ারছু

9
এটি একটি আকর্ষণীয় বিন্দু, তবে শেষ পর্যন্ত, একটি মিথ্যা প্রতিসাম্য। প্রোগ্রামারদের নান্দনিকতার তুলনায় যথার্থতার মূল্য দেওয়া উচিত।
ম্যাট ফেনউইক

1
@ আইয়ারছু ভ্যান্ট টাইপের বিষয়ে আপনি কী বোঝাতে চেয়েছিলেন তা আমার কাছে তাত্ক্ষণিকভাবে স্পষ্ট হয় নি, তাই অন্য যেভাবে আমার মতো বিভ্রান্ত হয়েছিল সে বিষয়ে আমি স্পষ্ট করে বলব। আপনি ভালো কিছু মনস্থ করা showThing :: Show a => a -> ValidShow aএবং readThing :: Read a => ValidShow a -> aযাতে জিনিস যে ধরনের দেখানো হয়েছিল ValidShow বস্তু পালন করা হয়। এভাবে আপনি লিখতে পারবেন না readThing (showThing True) :: String
অমলয়

12

@ অগাস্টস যেমন উল্লেখ করেছে, আপনি নিজের সুরক্ষিত পঠন কার্য করতে পারবেন। তবে, তিনি readMaybeপড়ার সাথে পুরোপুরি সামঞ্জস্যপূর্ণ নয়, কারণ এটি কোনও স্ট্রিংয়ের শেষে হোয়াইটস্পেসকে উপেক্ষা করে না। (আমি একবার এই ভুলটি করেছি, আমি প্রসঙ্গটি খুব মনে করি না)

এ খুঁজছি Haskell, 98 প্রতিবেদনে পঠিত সংজ্ঞা আমরা এটিকে বাস্তবায়ন পরিবর্তন করতে পারেন readMaybeযে সঙ্গে পুরোপুরি সামঞ্জস্যপূর্ণ read, এবং এই খুব অসুবিধাজনক নয় কারণ সব ফাংশন এর উপর নির্ভর করে প্রস্তাবনা সংজ্ঞায়িত করা হয়:

readMaybe        :: (Read a) => String -> Maybe a
readMaybe s      =  case [x | (x,t) <- reads s, ("","") <- lex t] of
                         [x] -> Just x
                         _   -> Nothing

1
ধন্যবাদ! শ্বেত স্পেস ইস্যুতে আমাকে সতর্ক করার জন্য +1, যা আগে স্পষ্ট করা হয়নি।
বিলাল বারাকাত

3
মনে রাখবেন যে আপনি যদি কেবল safeপ্যাকেজটি ব্যবহার করেন তবে আপনি readMaybeউপলব্ধ একটি সঠিক সংস্করণ পাবেন (এটি বলা হয় readMayএবং এটি এই সংস্করণের সাথে অভিন্ন
নীল মিচেল

8

এই ফাংশন (বলা হয় readMaybe) এখন হাস্কেল উপস্থাপিত! (বর্তমান বেস হিসাবে - 4.6)


2
ঠিক আছে, লিঙ্কযুক্ত পাঠ্যটি এটি পাঠ্যে রয়েছে e পড়ুন এবং প্রিলিডে নয় (মেইল পরিবর্তিত হতে পারে) তবে এটি এখনও আমাকে সহায়তা করেছে!
কাপিচু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.