কনটেন্টেশন সম্পর্কে একটি দুর্দান্ত সত্য ঘটনাটি হ'ল যদি আমি সমীকরণের কোনও দুটি ভেরিয়েবল জানি:
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
। কীভাবে এই তথ্য উপস্থাপন করবেন তা আমাদের খুঁজে বের করতে হবে; সরাসরি অনুমান করা যায় না, তখন আমরা গ্যারান্টি দেওয়ার জন্য কোনও প্রকারের স্বাক্ষরে কী যুক্ত করব?