যাতায়াত কার্যকর করার জন্য হাস্কেল প্রকারের ক্লাস ব্যবহার করা


11

আমি জ্যামিতিক বস্তুর জন্য এমন এক শ্রেণির সংজ্ঞা দিতে চাই যা একসাথে ছেদ করা যায়:

class Intersect a b c | a b -> c where
  intersect :: a -> b -> c
-- Language extensions: -XMultiParamTypeClasses, -XFunctionalDependencies

ধারণাটি হ'ল একটি সাধারণ-উদ্দেশ্য ছেদ ফাংশন যা বিভিন্ন ধরণের জিনিসগুলি পরিচালনা করতে পারে। কেউ যেমন উদাহরণগুলি কল্পনা করতে পারে

instance Intersect Line Plane (Maybe Point) where
  ...
instance Intersect Plane Plane (Maybe Line) where
  ...

তবে আমি এটিও ঘোষণা করতে চাই যে ছেদটি পরিবর্তনশীল:

instance (Intersect a b c) => Intersect b a c where
  intersect x y = intersect y x
-- Language extensions: -XUndecidableInstances

সমস্যাটি হ'ল আমি যখনই intersect x yপ্রথমে ফর্মের উদাহরণটি সংজ্ঞায়িত না করে মূল্যায়ন করি Intersect a b c, কোথায় এটির aপ্রকার xএবং bএর প্রকার y, প্রোগ্রামটি একটি অসীম লুপে চলে যায় , সম্ভবত পরিবহনের বিষয়ে পুনরাবৃত্ত উদাহরণের কারণে ঘটে caused আদর্শভাবে আমি intersect Egg Baconটাইপ-চেক করতে ব্যর্থ হওয়ার মতো কিছু চাই কারণ এ জাতীয় কোনও উদাহরণ সংজ্ঞায়িত হয়নি, আমাকে অসীম লুপে আটকাবেন না। আমি কীভাবে এটি বাস্তবায়ন করতে পারি?


টাইপ পরিবার ব্যবহার করে আপনি চেষ্টা করতে পারেন এমন কিছু মনে হচ্ছে। স্ট্যাক ওভারফ্লোতে আপনি আরও ভাল সাড়া পেতে পারেন।
বেনিয়ামিন হডসন

2
এখানে একটি মোনাড সম্পর্কে একটি ব্লগ পোস্ট রয়েছে যা চলাচলকে বল
ড্যানিয়েল দাজ ক্যারেট

উত্তর:


2

প্রথমত, আপনি চলাফেরার প্যাকেজটি ব্যবহার করতে পারেন, সেক্ষেত্রে আপনি intersectনিম্নলিখিতটির স্বাক্ষরটির ধরণটি সংশোধন করতে পারবেন তবে অন্যথায় আপনার কোডের বাকী অংশ "কেবলমাত্র" কাজ করবে:

instersect :: Commutative a b -> c

যাইহোক, আপনি টাইপক্লাসের সমস্ত দৃষ্টান্তে সম্পত্তি পরীক্ষা চালাতে যাতে বাস্তবে যাতায়াত না ঘটে তা নিশ্চিত করতে আপনি এইচএসপিকে দিয়ে কুইকচেক ব্যবহার করতে পারেন। এটি ওভারহেড হ্রাস করতে পারে - কারণ আমি আমার মাথার উপরের অংশটি জানি না you' তাই আপনাকে একটি বেঞ্চমার্ক করতে হবে। এই ক্ষেত্রে:

import Test.Hspec

main :: IO ()
main = hspec $ do
    describe "intersect" $ do
        parallel $ it "should commute" $ do
            property $ \x y -> intersect x y == intersect (y :: Point) (x :: Line)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.