2012-02-29 15 views
5

He tropezado recientemente sobre el genérica Control.Applicative.optional combinador:ejemplo no analizador de `Control.Applicative.optional`

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

pero no hacen mucho uso práctico para que combinador; p.ej. cuando se aplica a palabras funcionales puros, tales como listas o Maybe, los resultados no parecen muy útiles:

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

> optional Nothing 
Just Nothing 

> optional (Just 1) 
Just (Just 1) 

... lo que serían las aplicaciones más sensibles de optional?

+3

Bueno, los analizadores vienen a la mente :) –

+2

Hubo una larga discusión en el Café recientemente sobre 'algunos' y' muchos' que tienen los mismos casos de uso que 'opcional', es decir, analizadores y" cosas que pueden fallar ". .. http://www.haskell.org/pipermail/haskell-cafe/2011-December/097476.html –

Respuesta

13

Es útil para modelar cualquier cálculo que puede fallar.

Por ejemplo, digamos que se trata de STM y tiene las siguientes funciones:

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

Ahora, la optimización es agradable hacer después de inserciones, pero no es crítico. Así se podía ver este uso:

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

Esta función inserta dos intercepciones, luego intentos para optimizar la base de datos, pero si falla (debido a razones MCI, al igual que alguien era insertar algo en el tiempo), no es gran cosa; seguimos de todos modos.

optional funciona con STM, y también cualquier mónada de error en Control.Monad.Error, y un montón de cosas diferentes; ciertamente también para cálculos puros.

Cuestiones relacionadas