2016-08-09 15 views
7

कार्यों f :: a → b, g :: c → d, मैं कैसे लैम्ब्डालघु रास्ता ( (एक्स, वाई) -> (च एक्स, जी वाई))

\(x, y) → (f x, g y) :: (a, b) → (c, d) 

अधिक संक्षेप में लिख सकता हूँ के लिए? मैंने (f, g) की कोशिश की लेकिन - जैसा कि उम्मीद की जा रही थी मुझे लगता है - सफलता के बिना।

उत्तर

16

(,) की 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') 

एक करीबी रूप से पता चलता है कि दो प्रतिबंधित प्रकार बराबर हैं।

+4

अफसोस की बात है, यह बिल्कुल 'बिफुनक्टर' उदाहरण नहीं है। यह वास्तव में 'bimap f g ~ (x, y) = (f x, g y) 'है, जो केवल" नैतिक रूप से सही "है और यदि आप सावधान नहीं हैं तो स्पेस रिसाव का कारण बन सकता है। – dfeuer

+0

https://hackage.haskell.org/package/base-4.9.0.0/docs/src/Data.Bifunctor.html#line-78 – dfeuer

+0

ओह, मैंने सोचा * मैंने इसे यहां से कॉपी किया था (https: //hackage.haskell.org/package/bifunctors-3.2.0.1/docs/src/Data-Bifunctor.html), लेकिन स्पष्ट रूप से नहीं। मेरी आंखें '~' पर चमक गई होंगी। – chepner

9

आप (***)Control.Arrow अर्थात

f *** g 
7

से उपयोग कर सकते हैं की कोशिश करो

import Control.Arrow 

answer = f *** g $ (a, c) 

उदा

import Control.Arrow 

f :: Int -> Int 
f = (+1) 

g :: Double -> String 
g = show 

answer = f *** g $ (10, 3.5) 
संबंधित मुद्दे