0 থেকে 5 মান সহ একটি তালিকা উপস্থাপনের জন্য টাইপ করুন


13

আমার একটি অনুশীলন রয়েছে যেখানে আমাকে 0 থেকে 5 মান সহ একটি তালিকা উপস্থাপনের জন্য একটি প্রকারের সংজ্ঞা দিতে হবে। প্রথমে আমি ভেবেছিলাম আমি এটি এর মতো পুনরাবৃত্তভাবে সমাধান করতে পারি:

data List a = Nil | Content a (List a)

তবে আমি মনে করি না এটি সঠিক পন্থা। আপনি কি আমাকে একটি চিন্তাভাবনা দিতে পারেন?

উত্তর:


11

আমি আপনার জন্য আপনার অনুশীলনের উত্তর দেব না - অনুশীলনের জন্য, উত্তরটি নিজেরাই বের করা ভাল - তবে এখানে এমন একটি ইঙ্গিত দেওয়া হয়েছে যা আপনাকে উত্তরের দিকে নিয়ে যেতে পারে: আপনি 0 থেকে 2 টি উপাদান হিসাবে একটি তালিকা নির্ধারণ করতে পারেন

data List a = None | One a | Two a a

এখন, আপনি কীভাবে এটি পাঁচটি উপাদানে প্রসারিত করতে পারেন সে সম্পর্কে ভাবেন।


9

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

পুনরাবৃত্তির সমাধান সহ, কৌশলটি হ'ল "কাউন্টার" পরিবর্তনটি পুনরাবৃত্তির নিচে নামিয়ে আনা এবং তারপরে আপনি যখন সর্বাধিক অনুমোদিত তখন পৌঁছে যান তখন আরও উপাদান থাকা অক্ষম করে। এটি একটি জিএডিডি সহ সুন্দরভাবে করা যায়:

{-# LANGUAGE GADTs, DataKinds, KindSignatures, TypeInType, StandaloneDeriving #-}

import Data.Kind
import GHC.TypeLits

infixr 5 :#
data ListMax :: Nat -> Type -> Type where
  Nil :: ListMax n a
  (:#) :: a -> ListMax n a -> ListMax (n+1) a

deriving instance (Show a) => Show (ListMax n a)

তারপর

*Main> 0:#1:#2:#Nil :: ListMax 5 Int
0 :# (1 :# (2 :# Nil))

*Main> 0:#1:#2:#3:#4:#5:#6:#Nil :: ListMax 5 Int

<interactive>:13:16: error:
     Couldn't match type 1 with 0
      Expected type: ListMax 0 Int
        Actual type: ListMax (0 + 1) Int
     In the second argument of ‘(:#)’, namely 5 :# 6 :# Nil
      In the second argument of ‘(:#)’, namely 4 :# 5 :# 6 :# Nil
      In the second argument of ‘(:#)’, namely 3 :# 4 :# 5 :# 6 :# Nil

অনেক ধন্যবাদ. কারণ এটি একটি প্রাথমিক অনুশীলন বলে আমি মনে করি এটি সহজ পদ্ধতির। তবে আমি আপনার পদ্ধতির বিষয়েও চিন্তা করব।
মেয়রফ

6

সম্পূর্ণতার স্বার্থে, আমাকে একটি "কুরুচিপূর্ণ" বিকল্প পদ্ধতির যোগ করতে দিন, যা তবে এটি মূল বিষয়।

স্মরণ করুন এটি Maybe aএমন এক ধরণের যা এর মানগুলি ফর্মের Nothingবা কারও Just xজন্য x :: a

সুতরাং, উপরের মানগুলি পুনরায় ব্যাখ্যা করে আমরা Maybe aএকটি "সীমাবদ্ধ তালিকার ধরণ" হিসাবে বিবেচনা করতে পারি যেখানে তালিকার শূন্য বা একটি উপাদান থাকতে পারে।

এখন, (a, Maybe a)কেবল আরও একটি উপাদান যুক্ত করুন, সুতরাং এটি "তালিকার ধরণ" যেখানে তালিকায় একটি ( (x1, Nothing)) বা দুটি ( (x1, Just x2)) উপাদান থাকতে পারে।

সুতরাং, Maybe (a, Maybe a)একটি "তালিকার ধরণ" যেখানে তালিকার শূন্য ( Nothing), একটি ( Just (x1, Nothing)), বা দুটি ( (Just (x1, Just x2)) উপাদান থাকতে পারে।

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


হাস্কেলের কয়েকটি উন্নত বৈশিষ্ট্য ব্যবহার করে আমরা একটি ধরণের পরিবার ব্যবহার করে উপরেরটিকে সাধারণীকরণ করতে পারি:

type family List (n :: Nat) (a :: Type) :: Type where
    List 0 a = ()
    List n a = Maybe (a, List (n-1) a)

এই উত্তরটি সর্বাধিক দৈর্ঘ্যের এন -এর তালিকা ভিত্তিক পরিবারের সাথে বাড়ানো যেতে পারে ।
বামে

টুইটারে এটি কোনও শিক্ষানবিসের জন্য কিছুটা বেশি হতে পারে তবে আমি এটি যাইহোক যোগ করেছিলাম।
চি

সর্বাধিক তিনটি aএস Either () (a, Either () (a, Either () (a, Either () ())))... আকর্ষণীয় টাইপ বীজগণিত foldr (.) id (replicate 3 $ ([0] ++) . liftA2 (+) [1]) $ [0] == [0,1,2,3],।
নেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.