2013-07-25 14 views
6

की एक सूची के लिए एक मूल्य लागू करने के लिए मैं प्राप्त करना चाहते हैं क्या है:कैसे काम करता है

map :: (a -> b) -> [a] -> [b] 

मैं Hoogle की कोशिश की है:

apply :: a -> [a -> b] -> [b] 

इस नक्शे के विपरीत की तरह है , लेकिन कोई फायदा नहीं हुआ। क्या कोई हास्केल में ऐसा करने का एक साफ तरीका सुझा सकता है?

उत्तर

15
apply :: a -> [a -> b] -> [b] 
apply a = map ($ a) 

जो

apply a = map (\f -> f a) 

जो और अधिक स्पष्ट हो सकता है कह रही है की एक सारगर्भित तरीका है।

3

\a -> map ($ a) निश्चित रूप से ठीक है, लेकिन शायद अभी तक एक सा अच्छे एक Applicative दृष्टिकोण है: वहाँ है

<**> :: Applicative f => f a -> f (a -> b) -> f b 

जो एक उदाहरण <*> :: [a] -> [a->b] -> [b] है। आप जो चाहते हैं उसे बहुत कुछ लगता है! आपको केवल एक सिंगलटन सूची में अपना a मान डालना होगा, जिसके लिए Applicative: pure में एक समर्पित फ़ंक्शन भी है।

apply :: Applicative f => a -> f (a -> b) -> f b 
apply = (<**>) . pure 

हालांकि वास्तव में, मैं नहीं बल्कि हस्ताक्षर a -> [a->b] -> [b] को यह शीर्ष स्तर के बंधन के लिए प्रतिबंधित है, क्योंकि Applicative बनाता है यह देखने के लिए की तरह आप, संभव सबसे सामान्य हस्ताक्षर है जो यह नहीं है:

apply :: Functor f => a -> f (a -> b) -> f b 
apply a = fmap ($ a) 

वास्तव में, जब आप कुछ पाइपलाइन में होते हैं तो मेरा समाधान शायद सबसे अच्छा होता है, मुझे apply परिभाषित करने के लिए सबसे अच्छा है, लेकिन (<**>) . pure सीधे कोड में उपयोग करें।

+2

अनुप्रयोगी कानूनों, 'तक ((<**>)। शुद्ध) यू == यू <*> शुद्ध y == शुद्ध ($ y) सभी' Applicative's के लिए <*> यू == FMAP ($ वाई) u', लेकिन आखिरी बस सामान्य है। –

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