লাম্বদা শর্তাদি তাদের বিনামূল্যে ভেরিয়েবলগুলি দ্বারা প্যারাম্যাট্রাইজ করার জন্য এই উপস্থাপনাটি বিবেচনা করুন। (বেলগার্ডি এবং হুক ১৯৯৪, বার্ড অ্যান্ড পেটারসন ১৯৯৯, আলটেনকির্চ এবং রেইস ১৯৯৯ এর কাগজপত্র দেখুন See)
data Tm a = Var a
| Tm a :$ Tm a
| Lam (Tm (Maybe a))
Functor
নাম পরিবর্তন Monad
করার ধারণাকে ক্যাপচার করে এবং প্রতিস্থাপনের ধারণাটি ক্যাপচার করে আপনি অবশ্যই এটি তৈরি করতে পারেন ।
instance Functor Tm where
fmap rho (Var a) = Var (rho a)
fmap rho (f :$ s) = fmap rho f :$ fmap rho s
fmap rho (Lam t) = Lam (fmap (fmap rho) t)
instance Monad Tm where
return = Var
Var a >>= sig = sig a
(f :$ s) >>= sig = (f >>= sig) :$ (s >>= sig)
Lam t >>= sig = Lam (t >>= maybe (Var Nothing) (fmap Just . sig))
এখন বন্ধ শব্দগুলি বিবেচনা করুন : এগুলির বাসিন্দারা Tm Void
। আপনার ইচ্ছামত মুক্ত ভেরিয়েবলগুলির সাথে শর্তাবলী বদ্ধ শর্তাদি এম্বেড করতে সক্ষম হওয়া উচিত। কীভাবে?
fmap absurd :: Tm Void -> Tm a
অবশ্যই ধরা পড়ে যে এই ফাংশনটি সঠিকভাবে কিছুই না করে শব্দটিকে অতিক্রম করবে। তবে এটি তার চেয়েও বেশি সততার স্পর্শ unsafeCoerce
। এবং এজন্যই এতে vacuous
যুক্ত করা হয়েছিল Data.Void
...
অথবা একটি মূল্যায়নকারী লিখুন। এখানে মুক্ত ভেরিয়েবল সহ মান রয়েছে b
।
data Val b
= b :$$ [Val b]
| forall a. LV (a -> Val b) (Tm (Maybe a))
আমি সবেমাত্র ল্যাম্বডাসকে ক্লোজার হিসাবে উপস্থাপন করেছি। মূল্যায়ন a
ওভার মানগুলিতে ফ্রি ভেরিয়েবল ম্যাপিং দ্বারা পরিবেশক প্যারামেট্রাইজড হয় b
।
eval :: (a -> Val b) -> Tm a -> Val b
eval g (Var a) = g a
eval g (f :$ s) = eval g f $$ eval g s where
(b :$$ vs) $$ v = b :$$ (vs ++ [v])
LV g t $$ v = eval (maybe v g) t
eval g (Lam t) = LV g t
তুমি এটা অনুধাবন কর. যে কোনও টার্গেটে একটি বদ্ধ শব্দটি মূল্যায়ন করা
eval absurd :: Tm Void -> Val b
সাধারণভাবে, Void
খুব কমই এটি নিজস্বভাবে ব্যবহৃত হয়, তবে আপনি যখন কোনও প্রকারের প্যারামিটারটি এমনভাবে ইনস্ট্যান্ট করতে চান যা কোনও ধরণের অসম্ভবকে নির্দেশ করে (উদাহরণস্বরূপ, এখানে একটি বদ্ধ মেয়াদে একটি মুক্ত ভেরিয়েবল ব্যবহার করে)। প্রায়শই এই parametrized ধরনের উচ্চতর-অর্ডার ফাংশন অপারেশন পুরো ধরনের উপর পরামিতি উপর অপারেশন তুলে সঙ্গে আসা (যেমন, এখানে, fmap
, >>=
, eval
)। সুতরাং আপনি absurd
সাধারণ উদ্দেশ্যে অপারেশন হিসাবে পাস Void
।
অন্য উদাহরণের জন্য, Either e v
গণনাগুলি ক্যাপচার করার জন্য কল্পনা করুন যা আশাকরি আপনাকে একটি দেয় v
তবে এটির ব্যতিক্রম বাড়াতে পারে e
। আপনি এই পদ্ধতিটি খারাপ আচরণের ঝুঁকি দলিল হিসাবে অভিন্নভাবে ব্যবহার করতে পারেন। এই সেটিংটিতে নিখুঁতভাবে আচরণ করা গণনার e
জন্য হতে হবে Void
, তারপরে ব্যবহার করুন
either absurd id :: Either Void v -> v
নিরাপদে চালানো বা
either absurd Right :: Either Void v -> Either e v
অনিরাপদ বিশ্বে নিরাপদ উপাদান এম্বেড করতে।
ওহ, এবং একটি শেষ হররে, একটি "ঘটতে পারে না" পরিচালনা করে। এটি জেনেরিক জিপার নির্মাণে প্রদর্শিত হয়, যেখানেই কার্সার হতে পারে না।
class Differentiable f where
type D f :: * -> *
plug :: (D f x, x) -> f x
newtype K a x = K a
newtype I x = I x
data (f :+: g) x = L (f x)
| R (g x)
data (f :*: g) x = f x :&: g x
instance Differentiable (K a) where
type D (K a) = K Void
plug (K v, x) = absurd v
আমি সিদ্ধান্ত নিলাম বাকীটি মুছে ফেলবেন না, যদিও এটি একেবারেই প্রাসঙ্গিক নয়।
instance Differentiable I where
type D I = K ()
plug (K (), x) = I x
instance (Differentiable f, Differentiable g) => Differentiable (f :+: g) where
type D (f :+: g) = D f :+: D g
plug (L df, x) = L (plug (df, x))
plug (R dg, x) = R (plug (dg, x))
instance (Differentiable f, Differentiable g) => Differentiable (f :*: g) where
type D (f :*: g) = (D f :*: g) :+: (f :*: D g)
plug (L (df :&: g), x) = plug (df, x) :&: g
plug (R (f :&: dg), x) = f :&: plug (dg, x)
আসলে, এটি প্রাসঙ্গিক হতে পারে। আপনি যদি দুঃসাহসী বোধ করেন তবে এই অসমাপ্ত নিবন্ধটি দেখায় যে কীভাবে Void
বিনামূল্যে ভেরিয়েবলগুলির সাথে শর্তগুলির উপস্থাপনা সংকুচিত করতে ব্যবহার করতে হয়
data Term f x = Var x | Con (f (Term f x))
কোনও সিন্ট্যাক্সে Differentiable
এবং Traversable
ফান্টেক্টর থেকে অবাধে উত্পাদিত f
। আমরা Term f Void
কোনও মুক্ত ভেরিয়েবলবিহীন অঞ্চলগুলির প্রতিনিধিত্ব করতে এবং কোনও বিচ্ছিন্ন মুক্ত ভেরিয়েবলের সাথে অঞ্চলগুলির মধ্য দিয়ে টিউব টানেলিং [D f (Term f Void)]
উপস্থাপন করতে ব্যবহার করি , অথবা দুটি বা আরও বেশি মুক্ত ভেরিয়েবলের পথে একটি জংশন। অবশ্যই নিবন্ধটি শেষ করতে হবে।
কোনও মূল্য নেই এমন এক ধরণের জন্য (বা কমপক্ষে, ভদ্র সংস্থায় কথা বলার অপেক্ষা রাখে না), Void
উল্লেখযোগ্যভাবে কার্যকর। এবং absurd
আপনি এটি ব্যবহার কিভাবে হয়।
absurd
ফাংশন সঙ্গে এই নিবন্ধটি ডিলিং ব্যবহার করা হয়েছেCont
একসংখ্যা: haskellforall.com/2012/12/the-continuation-monad.html