मैं इस समय 20 Intermediate Haskell Exercises के माध्यम से काम कर रहा हूं, जो कि एक मजेदार व्यायाम है। इसमें टाइपक्लास Functor
और Monad
(और Functor
एस और Monad
एस तर्क के रूप में कार्य करने वाले फ़ंक्शन) के साथ-साथ Furry
और Misty
जैसे प्यारे नामों के साथ हम जो भी कर रहे हैं उसे छिपाने के लिए (कुछ रोचक कोड के लिए बनाता है) के विभिन्न उदाहरणों को लागू करना शामिल है।पॉइंटफ्री शैली में फ़ंक्शन लिखने के लिए सामान्य योजना क्या है?
मैं इसे कुछ बिंदु-मुक्त शैली में करने की कोशिश कर रहा हूं, और मुझे आश्चर्य हुआ कि क्या पॉइंट-फुल (?) परिभाषा को बिंदु-मुक्त परिभाषा में बदलने के लिए एक सामान्य योजना है। उदाहरण के लिए, यहाँ Misty
के लिए typeclass है:
class Misty m where
unicorn :: a -> m a
banana :: (a -> m b) -> m a -> m b
(कार्यों unicorn
और banana
return
और >>=
कर रहे हैं, के मामले में यह स्पष्ट नहीं है) और यहाँ apple
की मेरी कार्यान्वयन है (flip ap
के बराबर):
apple :: (Misty m) => m a -> m (a -> b) -> m b
apple x f = banana (\g -> banana (unicorn . g) x) f
अभ्यास के बाद भागों आप को लागू है संस्करणों की liftM
, liftM2
आदि यहाँ मेरी समाधान हैं:
appleTurnover :: (Misty m) => m (a -> b) -> m a -> m b
appleTurnover = flip apple
banana1 :: (Misty m) => (a -> b) -> m a -> m b
banana1 = appleTurnover . unicorn
banana2 :: (Misty m) => (a -> b -> c) -> m a -> m b -> m c
banana2 f = appleTurnover . banana1 f
banana3 :: (Misty m) => (a -> b -> c -> d) -> m a -> m b -> m c -> m d
banana3 f x = appleTurnover . banana2 f x
banana4 :: (Misty m) => (a -> b -> c -> d -> e) -> m a -> m b -> m c -> m d -> m e
banana4 f x y = appleTurnover . banana3 f x y
अब, banana1
(समकक्ष liftM
करने के लिए या fmap
) मैं pointfree शैली में लागू करने के लिए, appleTurnover
का एक उपयुक्त परिभाषा से कर रहा था। लेकिन अन्य तीन कार्यों के साथ मुझे पैरामीटर का उपयोग करना पड़ा।
मेरा प्रश्न है: इन तरह की परिभाषाओं को पॉइंट-फ्री परिभाषाओं में बदलने के लिए एक नुस्खा है?
यह अमूर्त उन्मूलन तुम क्या से कनेक्ट हो गया लैम्ब्डा कैलकुस एक्सप्रेशन को संयोजकों में बदलने के लिए। आप स्टैंडअलोन [पॉइंटफ्री] (http://hackage.haskell.org/package/pointfree) टूल भी देख सकते हैं ([lambdabot] में '@ pl' के रूप में भी उपलब्ध है) (http://www.haskell.org/haskellwiki/Lambdabot))। – ehird
[एक संबंधित चर्चा मैं दूसरे दिन किसी मित्र के साथ थी] (https://gist.github.com/1507246)। आपको यह दिलचस्प लगेगा। – missingfaktor