(,)
की Bifunctor
उदाहरण के लिए आप क्या देख रहे है:
instance Bifunctor (,) where
bimap f g (a, b) = (f a, g b)
bimap
एक टपल, प्रत्येक तत्व के लिए एक करने के लिए दो कार्य लागू होता है।
> import Data.Bifunctor
> bimap (+1) (*5) (1,1)
(2, 5)
आप सोच रहे होंगे कि क्या bimap
और (***)
के बीच अंतर है।
> :t bimap
bimap :: Bifunctor p => (a -> b) -> (c -> d) -> p a c -> p b d
> :t (***)
(***) :: Arrow a => a b c -> a b' c' -> a (b, b') (c, c')
bimap
से, आप एक मनमाना bifunctor p
से tuples के लिए प्रकार सीमित कर सकते हैं, ताकि p ~ (,)
साथ, bimap
के प्रकार
(a -> b) -> (c -> d) -> (a, c) -> (b, d).
(***)
साथ
हो जाता है, आप के लिए प्रकार सीमित कर सकते हैं एक मनमाना तीर a
के बजाय कार्य, ताकि a ~ (->)
के साथ (***)
का प्रकार
(b -> c) -> (b' -> c') -> (b, b') -> (c, c')
एक करीबी रूप से पता चलता है कि दो प्रतिबंधित प्रकार बराबर हैं।
अफसोस की बात है, यह बिल्कुल 'बिफुनक्टर' उदाहरण नहीं है। यह वास्तव में 'bimap f g ~ (x, y) = (f x, g y) 'है, जो केवल" नैतिक रूप से सही "है और यदि आप सावधान नहीं हैं तो स्पेस रिसाव का कारण बन सकता है। – dfeuer
https://hackage.haskell.org/package/base-4.9.0.0/docs/src/Data.Bifunctor.html#line-78 – dfeuer
ओह, मैंने सोचा * मैंने इसे यहां से कॉपी किया था (https: //hackage.haskell.org/package/bifunctors-3.2.0.1/docs/src/Data-Bifunctor.html), लेकिन स्पष्ट रूप से नहीं। मेरी आंखें '~' पर चमक गई होंगी। – chepner