2012-05-30 9 views
5

मैं मज़दूरों, आवेदक मज़दूरों पर नजर रख रहा हूं ... मुझे यकीन नहीं है कि मैं कहां से प्राप्त करना चाहता हूं, लेकिन मुझे यह महसूस हो रहा है कि प्रकारों के बाद मुझे करीब आना चाहिए।क्या मैं तीर के बिना एक जोड़ी का पहला तत्व मैप कर सकता हूं?

क्या map -alike बनाने का कोई आसान तरीका है जो केवल 2-टुपल के पहले तत्व पर लागू होता है? Control.Arrow से first ले रहा है और Arrow (->) का उपयोग कर, यह करता है अच्छी तरह से चाल:

map . first :: (b -> c) -> [(b, d)] -> [(c, d)] 

मेरी केवल चिंता मैं अभी तक तीर के लिए एक असली अंतर्ज्ञान हासिल करने के लिए है, और इसलिए मैं शायद जल्दी ही गहरे पानी में अपने आप को लगता है या चल जाएगा कि है बाद में अगर मैं इसे रखता हूं। इसके अलावा, यह एक सुविधाजनक मामला प्रतीत होता है जिसे सामान्यीकृत नहीं किया जा सकता है।

क्या मैं चाहता हूं कि दिल के लिए मज़ेदार, मोनैड या जो कुछ भी हो, मैं कुछ वही कार्यक्षमता प्राप्त कर सकूं? मैं

\f -> map (f `on` fst) 

के साथ-साथ विचारों के समान था, लेकिन वहां काफी कुछ नहीं मिल सका।

+11

आपको असहज बनाता है, कम अमूर्त संस्करण 'मानचित्र (\ (ए, बी) -> (एफए, बी) -> का उपयोग करने के साथ * बिल्कुल कुछ नहीं * गलत है। –

+0

सभी सुझावों के लिए धन्यवाद!यह वास्तव में प्रबुद्ध रहा है। आपके द्वारा शीर्ष वोट वाले उत्तर को स्वीकार कर लिया है। – Ashe

+0

यदि आप 'मानचित्र के साथ असहज महसूस करते हैं तो http://stackoverflow.com/questions/413930 देखें। first'। – sdcvvc

उत्तर

9

तीरों पर टुपल्स पर काम करने के लिए अच्छे संयोजक हैं। आप लगभग उन गायब tuple कार्यों के रूप में उनके बारे में सोच सकते हैं!

तो उदा।

> :t \f -> map (f *** id) 
    :: (b -> c) -> [(b, c')] -> [(c, c')] 

पहले घटक पर मैपिंग के लिए एक उपयोगी तरीका है।

+2

आप दूसरे तत्व पर लागू करने के लिए एक जोड़ी के पहले तत्व में एक फ़ंक्शन को लागू करने के लिए "(.com) से" कंट्रोल.एरो) "मानचित्र (पहले एफ)" का उपयोग भी कर सकते हैं। – ozataman

5

एक और अमूर्त जो इस तरह की चीज कर सकता है वह एक बिफुनक्टर है। एडवर्ड Kmett में एक पैकेज है जिसे bifunctors कहा जाता है। Data.Bifunctor में इस कार्यक्षमता के लिए एक प्रकार का वर्ग है और इसमें 2-टुपल्स के लिए उदाहरण शामिल है।

1

ठीक है, BiFunctor पैकेज है।

या आप एक उलट जोड़ी प्रकार इस्तेमाल कर सकते हैं:

data Flip a b = Flip b a 

instance Functor (Flip a) where 
    fmap f (Flip x y) = Flip (f x) y 
2

तो तुम प्रकार (a -> b) -> (a,c) -> (b,c) के एक समारोह के लिए देख रहे हैं। यह बहुत अच्छा है, तो आप सिर्फ

{-# LANGUAGE TupleSections #-} 
instance Functor (,c) where 
    fmap f (x,c) = (f x, c) 

लिख सकता है लेकिन दुर्भाग्य से टपल वर्गों केवल मूल्य स्तर पर काम करेगा। मुझे नहीं पता कि इसके लिए सैद्धांतिक कारण है या नहीं; मुझे लगता है कि यह उच्च-आदेश प्रकार एकीकरण को गड़बड़ कर देता है।

Hayoo पैकेज Data.Tuple.HT पैकेज के साथ आया जहां समारोह mapFst कहा जाता है।

बिफुनक्टर तक जाने के बिना ((,) के लिए बायफंक्टर उदाहरण वास्तव में जो कुछ आप चाहते हैं और कुछ और नहीं) या तीर, आप जो चाहते हैं उसे प्राप्त करने का कोई तरीका नहीं है, मुझे कम से कम पता है।

2

मुझे लगता है कि समस्या वहाँ भी कई तरीके हैं वह यह है कि - मुझे लगता है कि मैं डैनियल वैगनर के सलाह के साथ जाना होगा - लेकिन यहाँ अपने मनोरंजन के लिए एक और है: एक अमूर्त का उपयोग कर आप समझ में नहीं आता

{-#LANGUAGE DeriveFunctor, MultiParamTypeClasses #-} 
import Control.Newtype 

newtype P a b = P {p:: (b, a)} deriving (Show,Eq,Ord,Functor) 
instance Newtype (P a b) (b,a) where pack = P; unpack = p 

-- *Main> fmap even ("Hi",4) 
-- ("Hi",True) 
-- *Main> map (fmap even) [("Hi",4),("Bye",5)] 
-- [("Hi",True),("Bye",False)] 
-- *Main> under P (fmap even) (4,"Hi") 
-- (True,"Hi") 
-- *Main> map (under P (fmap even)) [(4,"Hi"),(5,"Bye")] 
-- [(True,"Hi"),(False,"Bye")] 
संबंधित मुद्दे

 संबंधित मुद्दे