আপনি হাসকেলে কোনও গ্রাফকে কীভাবে উপস্থাপন করবেন?


125

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

type Nodetag = String
type Neighbours = [Nodetag]
data Node a = Node a Nodetag Neighbours

এবং এটি কার্যক্ষম হবে। তবে এটি কিছুটা হতাশায় অনুভূত হয়; কাঠামোর বিভিন্ন নোডের লিঙ্কগুলি তালিকার বর্তমান এবং পরবর্তী উপাদানগুলির মধ্যে বা গাছের নোডের বাবা-মা এবং বাচ্চাদের মধ্যে যে লিঙ্কগুলি রয়েছে তা ঠিক "অনুভব" করে না। আমার একটা কুঁচক আছে যে আমি গ্রাফিকটিতে বীজগণিত ম্যানিপুলেশনগুলি করছিলাম যেহেতু এটি ট্যাগ সিস্টেমের মাধ্যমে প্রবর্তিত স্তরটি কিছুটা বাধা হয়ে দাঁড়াবে।

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

আসলে কি হচ্ছে?


12
আপনি হয়ত ফাংশনাল গ্রাফ অ্যালগরিদমগুলিতে মার্টিন এরউইগের কাগজটিতে আগ্রহী: ওয়েব.ইনগ্রিওররেগনস্টেট.এডু / wেরভিগ / পেপারস / অ্যাবস্ট্রাক্টস html#JFP01 । এর fglবাইরে প্যাকেজটি বিকশিত হয়েছিল।
জন এল

99 Haskell, সমস্যার পৃষ্ঠা শো একটি সমস্যা সমাধান প্রসঙ্গে ব্যবহৃত গ্রাফ কিছু উদাহরণ। বিভিন্ন উপস্থাপনায় এটির একটি সংক্ষিপ্ত পরিচিতিও রয়েছে।
ডোপামনে

উত্তর:


47

খাঁটি ভাষায় চক্র সহ ডেটা স্ট্রাকচার উপস্থাপনের চেষ্টা করাও আমার কাছে বিশ্রী মনে হয়। এটি চক্র যা আসলেই সমস্যা; কারণ মানগুলি যে কোনও এডিটিতে ভাগ করা যায় যা ধরণের সদস্য (তালিকাগুলি এবং গাছগুলি সহ) থাকতে পারে তা সত্যই একটি ডিএজি (নির্দেশিত অ্যাসাইক্লিক গ্রাফ)। মূল সমস্যাটি হ'ল যদি আপনার A এবং B এর মান থাকে, যার সাথে A রয়েছে B এবং B থাকে A থাকে তবে অন্যটির উপস্থিতির আগে দুটিই তৈরি করা যায় না। হাস্কেল অলস হওয়ার কারণে আপনি এটিকে ঘিরে ধরার জন্য টাইং দ্য নট নামে পরিচিত একটি কৌশল ব্যবহার করতে পারেন তবে এটি আমার মস্তিষ্ককে আঘাত করে (কারণ আমি এখনও এর বেশি কিছু করি নি)। আমি এ পর্যন্ত হাস্কেলের চেয়ে বুধে আমার যথেষ্ট প্রোগ্রামিং করেছি এবং বুধ কঠোর তাই গিঁট বেঁধে কোন লাভ হয় না।

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

যাইহোক, "হাস্কেল গ্রাফ" এর জন্য একটি দ্রুত গুগল আমাকে http://www.haskell.org/haskellwiki/The_Monad.Reader/Issue5/ প্রাকটিক্যাল_গ্রাফ_হ্যান্ডলিংয়ে নিয়ে গেছে , যা দেখতে পঠন মতো সার্থক।


62

শ্যাংয়ের উত্তরে আপনি কীভাবে আলস্যতা ব্যবহার করে কোনও গ্রাফ উপস্থাপন করবেন তা দেখতে পাবেন। এই উপস্থাপনগুলির সাথে সমস্যাটি হ'ল এগুলি পরিবর্তন করা খুব কঠিন। গিঁট বাঁধার কৌশল কেবল তখনই কার্যকর যখন আপনি একবার গ্রাফ তৈরি করতে যাচ্ছেন, এবং এরপরে কখনও পরিবর্তন হয় না।

বাস্তবে, আমি আসলে চাওয়া উচিত না আমার গ্রাফ সঙ্গে কিছু, আমি আরো পথচারী উপস্থাপনা ব্যবহার করুন:

  • প্রান্ত তালিকা
  • সংলগ্ন তালিকা
  • প্রতিটি নোডকে একটি অনন্য লেবেল দিন, পয়েন্টারের পরিবর্তে লেবেলটি ব্যবহার করুন এবং লেবেল থেকে নোড পর্যন্ত সীমাবদ্ধ মানচিত্র রাখুন

আপনি যদি গ্রাফটি ঘন ঘন পরিবর্তন করতে বা সম্পাদনা করতে যাচ্ছেন তবে আমি হুটের জিপারের ভিত্তিতে একটি উপস্থাপনা ব্যবহার করার পরামর্শ দিচ্ছি। এটি নিয়ন্ত্রণ-প্রবাহ গ্রাফগুলির জন্য জিএইচসিতে অভ্যন্তরীণভাবে ব্যবহৃত উপস্থাপনা। আপনি এখানে এটি সম্পর্কে পড়তে পারেন:


2
গিঁট বাঁধার সাথে আরেকটি সমস্যা হ'ল দুর্ঘটনাক্রমে এটিকে খুলে ফেলা এবং প্রচুর জায়গা নষ্ট করা খুব সহজ।
hugomg

টুফ্টের ওয়েবসাইটে (কমপক্ষে এই মুহূর্তে) কিছু ভুল হয়েছে বলে মনে হয় এবং বর্তমানে এই লিঙ্কগুলির কোনওটিই কাজ করে না। আমি এগুলির জন্য কিছু বিকল্প আয়না সন্ধান করতে পেরেছি: হুয়েটের জিপার , হুপল: একটি মডুলার,
ডেটাফ্লো

37

বেন যেমন উল্লেখ করেছেন, হাস্কেলের চক্রাকার তথ্যগুলি "গিঁট বেঁধে" নামে একটি প্রক্রিয়া দ্বারা নির্মিত। অনুশীলনে, এর অর্থ হ'ল আমরা পারস্পরিক পুনরাবৃত্ত ঘোষণাগুলি letবা whereক্লজগুলি ব্যবহার করে লিখি , যা কাজ করে কারণ পারস্পরিক পুনরাবৃত্ত অংশগুলি অলসভাবে মূল্যায়ন করা হয়।

এখানে গ্রাফের একটি উদাহরণ রয়েছে:

import Data.Maybe (fromJust)

data Node a = Node
    { label    :: a
    , adjacent :: [Node a]
    }

data Graph a = Graph [Node a]

আপনি দেখতে পাচ্ছেন, আমরা Nodeইন্ডিরিয়ারেশনের পরিবর্তে প্রকৃত উল্লেখগুলি ব্যবহার করি use লেবেল সংঘের তালিকা থেকে গ্রাফটি তৈরি করে এমন কোনও ফাংশন কীভাবে প্রয়োগ করা যায় তা এখানে's

mkGraph :: Eq a => [(a, [a])] -> Graph a
mkGraph links = Graph $ map snd nodeLookupList where

    mkNode (lbl, adj) = (lbl, Node lbl $ map lookupNode adj)

    nodeLookupList = map mkNode links

    lookupNode lbl = fromJust $ lookup lbl nodeLookupList

আমরা (nodeLabel, [adjacentLabel])জোড়াগুলির একটি তালিকা নিই এবং Nodeএকটি মধ্যবর্তী লুকআপ-তালিকার (যা প্রকৃত গিঁট বেঁধে দেয়) মাধ্যমে প্রকৃত মানগুলি তৈরি করি। কৌশলটি হ'ল nodeLookupList(যার ধরণ রয়েছে [(a, Node a)]) ব্যবহার করে তৈরি করা হয়েছে mkNode, যা ঘুরে ঘুরে nodeLookupListঘেঁষে নোডগুলি খুঁজে বের করতে পারে to


20
আপনার উল্লেখ করা উচিত যে এই ডেটা স্ট্রাকচার গ্রাফগুলি বর্ণনা করতে সক্ষম নয়। এটি কেবল তাদের উদ্ঘাটনগুলি বর্ণনা করে। (সীমাবদ্ধ স্থানে অসীম উন্মোচন, কিন্তু এখনও ...)
রোটসর

1
কি দারুন. আমার কাছে সমস্ত উত্তর বিস্তারিতভাবে পর্যালোচনা করার সময় নেই, তবে আমি বলব যে অলস মূল্যায়নের শোষণ করে এমন শোনা যাচ্ছে যে আপনি পাতলা বরফে স্কেটিং করছিলেন। অসীম পুনরাবৃত্তিতে পিছলে যাওয়া কত সহজ হবে? তবুও দুর্দান্ত জিনিস এবং প্রশ্নটিতে প্রস্তাবিত ডেটাটাইপের চেয়ে অনেক বেশি ভাল লাগে।
TheIronKnuckle

@ দ্য আইরনকনকল অসীম তালিকার চেয়ে খুব বেশি পার্থক্য নেই যা হাস্কেলররা সর্বদা ব্যবহার করে :)
জাস্টিন এল।

37

এটি সত্য, গ্রাফগুলি বীজগণিত নয়। এই সমস্যাটি মোকাবেলায় আপনার কাছে কয়েকটি বিকল্প রয়েছে:

  1. গ্রাফের পরিবর্তে অসীম গাছ বিবেচনা করুন। গ্রাফের চক্রগুলিকে তাদের অসীম উন্মোচন হিসাবে প্রতিনিধিত্ব করুন। কিছু ক্ষেত্রে, আপনি "গিঁট বেঁধে রাখা" হিসাবে পরিচিত কৌশলটি ব্যবহার করতে পারেন (এখানে অন্যান্য উত্তরগুলির কয়েকটিতে ভালভাবে ব্যাখ্যা করা হয়েছে) এমনকি গর্তের মধ্যে একটি চক্র তৈরি করে সীমিত জায়গায় এই অসীম গাছগুলিকে উপস্থাপন করতে; তবে, আপনি হাস্কেলের মধ্যে থেকে এই চক্রগুলি পর্যবেক্ষণ বা সনাক্ত করতে সক্ষম হবেন না, যা বিভিন্ন গ্রাফ ক্রিয়াকলাপকে কঠিন বা অসম্ভব করে তোলে।
  2. সাহিত্যে বিভিন্ন গ্রাফ বীজগণিত উপলব্ধ। যে বিষয়টি প্রথমে মনে আসে তা হ'ল বিডাইরেক্টালাইজিং গ্রাফ ট্রান্সফর্মেশনগুলির বিভাগের দ্বিতীয় বিভাগে বর্ণিত গ্রাফ নির্মাতাদের সংগ্রহ । এই বীজগণিতগণ দ্বারা গ্যারান্টিযুক্ত সাধারণ সম্পত্তি হ'ল যে কোনও গ্রাফ বীজগণিতভাবে উপস্থাপন করা যায়; তবে, সমালোচনামূলকভাবে, অনেক গ্রাফের প্রামাণিক উপস্থাপনা থাকবে না । কাঠামোগতভাবে সমতা পরীক্ষা করা যথেষ্ট নয়; এটি সঠিকভাবে করা গ্রাফ আইসোমরফিজম সন্ধান করতে উত্সাহিত করে - এটি একটি কঠিন সমস্যার কিছু হিসাবে পরিচিত।
  3. বীজগণিত ডেটাটাইপগুলি ছেড়ে দিন; স্পষ্টভাবে নোড পরিচয় তাদের প্রতিটি অনন্য মান (বলে, Intগুলি) প্রদান করে এবং বীজগণিতের পরিবর্তে পরোক্ষভাবে তাদের উল্লেখ করে। প্রকার বিমূর্তি তৈরি করে এবং এমন ইন্টারফেস সরবরাহ করে যা আপনার জন্য দিকনির্দেশকে জাগ্রত করে তোলে তা উল্লেখযোগ্যভাবে আরও সুবিধাজনক করা যায়। এটি হ্যাকেজের উপর যেমন fgl এবং অন্যান্য ব্যবহারিক গ্রাফ লাইব্রেরি দ্বারা গৃহীত পদ্ধতি ।
  4. আপনার ব্র্যান্ডের নতুন পদ্ধতির সাথে আসুন যা আপনার ব্যবহারের ক্ষেত্রে হুবহু ফিট করে। এটি করা খুব কঠিন কাজ। =)

সুতরাং উপরোক্ত প্রতিটি পছন্দের পক্ষে মতামত রয়েছে। আপনার জন্য সবচেয়ে ভাল লাগবে এমনটি চয়ন করুন।


"আপনি হাস্কেলের মধ্যে থেকে এই চক্রগুলি পর্যবেক্ষণ বা সনাক্ত করতে পারবেন না" ঠিক সত্য নয় - এমন একটি লাইব্রেরি রয়েছে যা আপনাকে ঠিক এটি করতে দেয়! আমার উত্তর দেখুন।
আর্টিলিয়াস

গ্রাফ এখন বীজগণিত হয়! hackage.haskell.org/package/algebraic- অনুচ্ছেদ
জোশ.এফ

16

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

তার কাগজে, এারউইগ নিম্নলিখিত ধরণের উপস্থাপন করেছেন:

type Node = Int
type Adj b = [(b, Node)]
type Context a b = (Adj b, Node, a, Adj b)
data Graph a b = Empty | Context a b & Graph a b

(এর উপস্থাপনাটি fglকিছুটা আলাদা, এবং টাইপক্লাসগুলির ভাল ব্যবহার করে - তবে ধারণাটি মূলত একইরকম))

এরভিগ একটি মাল্টিগ্রাফ বর্ণনা করছেন যেখানে নোড এবং প্রান্তগুলিতে লেবেল রয়েছে এবং এতে সমস্ত প্রান্ত নির্দেশিত are এ- Nodeএর কোনও ধরণের লেবেল রয়েছে a; একটি প্রান্তে কিছু ধরণের লেবেল রয়েছে b। এ Contextহ'ল (1) নির্দিষ্ট নোডের দিকে নির্দেশ করে লেবেলযুক্ত প্রান্তগুলির একটি তালিকা , (2) প্রশ্নযুক্ত নোড, (3) নোডের লেবেল এবং (4) নোড থেকে নির্দেশিত লেবেলযুক্ত প্রান্তগুলির তালিকা । ক এর Graphপরে উভয়ই হিসাবে ইন্ডুকটিভ ধারণা করা যেতে পারে Empty, বা একটি বিদ্যমান মধ্যে Contextএকীভূত (সঙ্গে &) হিসাবে Graph

এরউইগ নোট হিসাবে, আমরা অবাধে একটি Graphসহ Emptyএবং জেনারেট করতে পারি না &, কারণ আমরা Consএবং Nilনির্মাণকারীগুলির সাথে একটি তালিকা তৈরি করতে পারি , বা এর Treeসাথে Leafএবং Branch। খুব বেশি, তালিকাগুলির বিপরীতে (অন্যরা উল্লেখ করেছেন), এর কোনও আধ্যাত্মিক উপস্থাপনা হবে না Graph। এগুলি গুরুত্বপূর্ণ পার্থক্য।

তবুও, কী এই উপস্থাপনাটিকে এত শক্তিশালী করে তোলে এবং তালিকা এবং গাছগুলির সাধারণ হাস্কেল উপস্থাপনার সাথে একই রকম, এটি Graphএখানে ডেটাটাইপকে inductively সংজ্ঞায়িত করা হয় । একটি তালিকা inductively সংজ্ঞায়িত করা হয় যে আমাদের এটিকে এত সংক্ষিপ্তভাবে প্যাটার্ন ম্যাচ করতে দেয়, একটি একক উপাদান প্রক্রিয়া করে এবং তালিকার বাকী অংশটি পুনরাবৃত্তভাবে প্রক্রিয়া করতে দেয়; সমানভাবে, এরউইগের প্রস্তাবনামূলক উপস্থাপনা আমাদের Contextএকসাথে একবারে গ্রাফটি প্রক্রিয়া করতে সহায়তা করে। গ্রাফের এই উপস্থাপনাটি কোনও গ্রাফের উপর ম্যাপ করার একটি সহজ সংজ্ঞা ( gmapযেমন গ্রাফের উপরে ufold) (যাতে গ্রাফের উপর ) অরর্ডার্ড ফোল্ডগুলি সম্পাদন করে তার জন্য নিজেকে ধার দেয় ।

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


14

আমি সর্বদা "ইন্ডাকটিভ গ্রাফস এবং ফাংশনাল গ্রাফ আলগোরিদিমস" -এ মার্টিন এরভিগের পদ্ধতির পছন্দ করি, যা আপনি এখানে পড়তে পারেন । এফডব্লিউআইডাব্লু, আমি একবার স্কাল বাস্তবায়নও লিখেছিলাম, https://github.com/nicolast/scalagraphs দেখুন


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

আমি একটি স্বাধীনতা নেব এবং টিখনের চমৎকার আলাপ পোস্ট করব এই বেগুনিটি / পোস্ট / 2015/2015 / 2015-05-2- শুদ্ধ- কার্যকরী- অনুচ্ছেদগুলি html
মার্টিন ক্যাপোডিসি

5

হাস্কেলের গ্রাফ উপস্থাপনের যে কোনও আলোচনার জন্য অ্যান্ডি গিলের ডেটা-রিফাই লাইব্রেরির একটি উল্লেখ প্রয়োজন (এখানে কাগজটি দেওয়া আছে )।

"বাঁধাই-দ্য" স্টাইলের উপস্থাপনাটি খুব মার্জিত ডিএসএল তৈরি করতে ব্যবহার করা যেতে পারে (নীচের উদাহরণ দেখুন)। তবে ডেটা স্ট্রাকচারটি সীমিত ব্যবহার। গিলের লাইব্রেরি আপনাকে উভয় বিশ্বের সেরা করার অনুমতি দেয়। আপনি একটি "গিঁট বেঁধে" ডিএসএল ব্যবহার করতে পারেন তবে পয়েন্টার ভিত্তিক গ্রাফকে একটি লেবেল ভিত্তিক গ্রাফে রূপান্তর করতে পারেন যাতে আপনি এতে আপনার পছন্দসই অ্যালগরিদমগুলি চালাতে পারেন।

এখানে একটি সহজ উদাহরণ:

-- Graph we want to represent:
--    .----> a <----.
--   /               \
--  b <------------.  \
--   \              \ / 
--    `----> c ----> d

-- Code for the graph:
a = leaf
b = node2 a c
c = node1 d
d = node2 a b
-- Yes, it's that simple!



-- If you want to convert the graph to a Node-Label format:
main = do
    g <- reifyGraph b   --can't use 'a' because not all nodes are reachable
    print g

উপরের কোডটি চালনার জন্য আপনার নিম্নলিখিত সংজ্ঞাগুলি দরকার:

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
import Data.Reify
import Control.Applicative
import Data.Traversable

--Pointer-based graph representation
data PtrNode = PtrNode [PtrNode]

--Label-based graph representation
data LblNode lbl = LblNode [lbl] deriving Show

--Convenience functions for our DSL
leaf      = PtrNode []
node1 a   = PtrNode [a]
node2 a b = PtrNode [a, b]


-- This looks scary but we're just telling data-reify where the pointers are
-- in our graph representation so they can be turned to labels
instance MuRef PtrNode where
    type DeRef PtrNode = LblNode
    mapDeRef f (PtrNode as) = LblNode <$> (traverse f as)

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


2

আমি এখান থেকে নেওয়া গ্রাফের এই বাস্তবায়ন পছন্দ করি

import Data.Maybe
import Data.Array

class Enum b => Graph a b | a -> b where
    vertices ::  a -> [b]
    edge :: a -> b -> b -> Maybe Double
    fromInt :: a -> Int -> b
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.