কনটেন্টেশন সম্পর্কে একটি দুর্দান্ত সত্য ঘটনাটি হ'ল যদি আমি সমীকরণের কোনও দুটি ভেরিয়েবল জানি:
a ++ b = c
তখন আমি তৃতীয়টি জানি।
আমি এই ধারণাটি আমার নিজস্ব উপসংগে ক্যাপচার করতে চাই তাই আমি কার্যকরী নির্ভরতা ব্যবহার করি।
{-# Language DataKinds, GADTs, FlexibleContexts, FlexibleInstances, FunctionalDependencies, KindSignatures, PolyKinds, TypeOperators, UndecidableInstances #-}
import Data.Kind (Type)
class Concatable
(m :: k -> Type)
(as :: k)
(bs :: k)
(cs :: k)
| as bs -> cs
, as cs -> bs
, bs cs -> as
where
concat' :: m as -> m bs -> m cs
এখন আমি এই জাতীয় মতবিরোধী তালিকা জালিয়াতি করছি:
data HList ( as :: [ Type ] ) where
HEmpty :: HList '[]
HCons :: a -> HList as -> HList (a ': as)
কিন্তু যখন আমি এগুলি প্রকাশ করার চেষ্টা করি তখন আমার Concatableএকটি সমস্যা আছে
instance Concatable HList '[] bs bs where
concat' HEmpty bs = bs
instance
( Concatable HList as bs cs
)
=> Concatable HList (a ': as) bs (a ': cs)
where
concat' (HCons head tail) bs = HCons head (concat' tail bs)
আমি আমার তৃতীয় কার্যক্ষম নির্ভরতা সন্তুষ্ট করি না। অথবা বরং সংকলক বিশ্বাস করে যে আমরা তা করি না। এটি কারণ কারণ সংকলক বিশ্বাস করে যে আমাদের দ্বিতীয় উদাহরণে এটি হতে পারে bs ~ (a ': cs)। এবং যদি এটি হতে পারে Concatable as (a ': cs) cs।
আমি কীভাবে আমার দৃষ্টান্তগুলি সামঞ্জস্য করতে পারি যাতে তিনটি নির্ভরতা সন্তুষ্ট হয়?
bsএবং cs, এবং আমরা fundep কাজে লাগান করতে চান, অর্থাত আমরা পুনর্গঠন করতে চান as। এটি একটি নির্বিচারে পদ্ধতিতে করতে, আমরা আশা করি যে কোনও একক প্রতিশ্রুতিবদ্ধ এবং সেই রেসিপিটি অনুসরণ করতে সক্ষম হব। কংক্রিটলি, ধরে নিও bs = (Int ': bs2)এবং cs = (Int ': cs2)। আমরা কোন উদাহরণটি বেছে নেব? এটা সম্ভব যে এই ধরনের হয় Intমধ্যে csথেকে আসে bs(এবং asখালি)। asপরিবর্তে (অমানবিক) থেকে আসা এটিও সম্ভব Intএবং csপরে এটি আবার উপস্থিত হবে । আমাদের আরও গভীরভাবে খনন csকরতে হবে এবং জিএইচসি তা করবে না।
bs cs -> as, কারণ আমাদের সম্পর্কে স্থানীয়bsএবং অদ্বিতীয় বা নীল হওয়া উচিতcsকিনা তা নির্ধারণের জন্য স্থানীয় তথ্য প্রয়োজনas। কীভাবে এই তথ্য উপস্থাপন করবেন তা আমাদের খুঁজে বের করতে হবে; সরাসরি অনুমান করা যায় না, তখন আমরা গ্যারান্টি দেওয়ার জন্য কোনও প্রকারের স্বাক্ষরে কী যুক্ত করব?