2012-02-29 9 views
5

I niedawno potknął generycznego Control.Applicative.optional Combinator:przykładem dla parser dla `Control.Applicative.optional`

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

ale nie mam dużo praktycznego użycia do tego Combinator; na przykład gdy stosowane do czystych funktorów takie jak listy lub Maybe, wyniki nie wydają się bardzo przydatna:

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

> optional Nothing 
Just Nothing 

> optional (Just 1) 
Just (Just 1) 

... co byłoby bardziej sensowne zastosowania optional?

+3

Cóż, parsery przychodzą na myśl :) –

+2

W "Cafe" ostatnio odbyła się długa dyskusja na temat "niektórych" i "wielu", które mają takie same przypadki użycia, jak "opcjonalne", czyli parsery i "rzeczy, które mogą zawieść". .. http://www.haskell.org/pipermail/haskell-cafe/2011-December/097476.html –

Odpowiedz

13

Przydaje się do modelowania dowolnych obliczeń, które mogą zawieść.

Na przykład, powiedzmy, że masz do czynienia z STM i posiada następujące funkcje:

-- 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 

Teraz, optymalizacja jest miło zrobić po wkładek, ale to nie jest krytyczna. Więc można zobaczyć ten Zastosowanie:

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

Ta funkcja umożliwia wstawienie dwóch ints, potem prób celu optymalizacji DB, ale jeśli to się nie powiedzie (z powodów STM, jak ten ktoś wkładając coś w tym czasie), to nie jest wielka sprawa; po prostu kontynuujemy.

optional współpracuje ze STM, a także dowolną monadą błędów w Control.Monad.Error i wieloma różnymi rzeczami; z pewnością także dla czystych obliczeń.