2012-02-29 10 views
5

के लिए मैं हाल ही में सामान्य Control.Applicative.optional Combinator से अधिक ठोकर खाई है:गैर पार्सर उदाहरण `Control.Applicative.optional`

optional :: Alternative f => f a -> f (Maybe a) 
optional v = Just <$> v <|> pure Nothing 

लेकिन मैं बहुत कि Combinator के लिए व्यावहारिक उपयोग न करें; जैसे जब ऐसी सूची या Maybe के रूप में शुद्ध functors के लिए आवेदन किया है, परिणाम बहुत उपयोगी नहीं प्रतीत होती हैं:

> optional [1,2,3] 
[Just 1,Just 2,Just 3,Nothing] 

> optional Nothing 
Just Nothing 

> optional (Just 1) 
Just (Just 1) 

... होगा क्या optional के अधिक समझदार अनुप्रयोगों?

+3

खैर, पार्सर्स दिमाग में वसंत :) –

+2

हाल ही में कैफे पर 'कुछ' और 'कई' के बारे में एक लंबी चर्चा हुई थी, जिसका उपयोग 'वैकल्पिक', यानी पार्सर्स और "चीजें जो असफल हो सकती हैं" के समान उपयोग मामलों में होती हैं। .. http://www.haskell.org/pipermail/haskell-cafe/2011- दिसम्बर/097476.html –

उत्तर

13

यह विफल होने की अनुमति देने वाली किसी भी गणना को मॉडलिंग के लिए उपयोगी है।

उदाहरण के लिए, मान लीजिए कि आप एसटीएम साथ काम कर रहे है और इन कार्यों करते हैं:

-- A database of Ints stored in a TVar 
intDatabase :: TVar (ComplexDatabaseStructure Int) 

-- Inserts an Int in the int database. 
insertInt :: Int -> STM() 

-- Organizes the DB so that it is more efficient 
optimizeDb :: STM() 

-- Checks whether an Int is in the DB 
lookupInt :: Int -> STM Bool 

अब, अनुकूलन आवेषण के बाद ऐसा करने के लिए अच्छा है, लेकिन यह महत्वपूर्ण नहीं है। तो अगर आप इस प्रयोग देख सकते हैं:

insert2AndCheck1 a b c = 
    insertInt a *> insertInt b *> optional optimizeDb *> lookupInt c 

इस समारोह दो ints, तो की कोशिश करता डीबी अनुकूलन करने के लिए सम्मिलित करता है, लेकिन अगर यह विफल रहता है (क्योंकि एसटीएम कारण से, कि किसी तरह समय में कुछ डालने था), यह एक बड़ा सौदा नहीं है; हम वैसे भी चलते हैं।

optional एसटीएम के साथ काम करता है, और Control.Monad.Error में कोई भी त्रुटि मोनड, और कई अलग-अलग चीजें; निश्चित रूप से शुद्ध गणना के लिए भी।

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