-

   rss_rss_sovety_linux

 - e-mail

 

 -

 LiveInternet.ru:
: 29.01.2008
:
:
: 2

:


if-

, 01 2010 . 16:26 +
Maybe Maybe ,
, , ?


, (if- case-). , , Maybe .

,



, , . , .

, , , Maybe a, a . Maybe a : Just a ( , ) Nothing (, ). Maybe , a b ( :: a -> b) Maybe a Maybe b ( :: Maybe a -> Maybe b). , f, *:

fmap :: (a -> b) -> (f a -> f b)


* fmap : 1) fmap id = id, id , , 2) fmap ... []


, :: -> , . , , , , . , , , . : fmap .

data  =  deriving Show
data = deriving Show

:: ->
=

:: (Maybe ) -> (Maybe )
= fmap


, :

ghci>  (Just )
Just
ghci> Nothing
Nothing


, a b ? Maybe (a -> b) Maybe a? , Maybe . Control.Applicative, (<*>).

. Maybe ( -> ) , ? , , , . - , , Nothing. , :

 = Nothing
= Just


, Maybe:

ghci> :m + Control.Applicative
ghci> <*> Just
Just
ghci> <*> Nothing
Nothing
ghci> <*> Just
Nothing
ghci> <*> Nothing
Nothing


, . : 1) (<$>), fmap ; 2) ( ), ap (<*>) ( , ).



. Matrix Market. , , ( ) (, ). .

:

if ( == ) {
if ( == ) {
;
} else if ( == ) {
;
} else if ( == ) {
;
} else {
;
}
} else if ( == ) {
if ( == ) {
;
} else if ( == ) {
;
} else if ( == ) {
;
} else {
;
}
} else {
;
}


, , . , , . .

:

let  = lookup  
= lookup
in


. . , lookup Maybe a. , Maybe , Maybe , Maybe . ? -, (<*>).

, Maybe a. , - (Just a) (Nothing), , , . , , , . (<*>) - :

let  = lookup  
= lookup
in case (, ) of
(Just f, Just g) -> Just (f g )
_ -> Nothing


, Maybe- , Maybe- ( ).

, , :

let  = lookup   
= lookup
in <*> <*> (Just )


, , , , Just .

, :

let p = lookup fmt parsers        :: Maybe FormatReader
nr = lookup fieldq readers :: Maybe (Int, ValueReader)
sy = lookup symq symmetries :: Maybe Symmetry
p' = uncurry <$> p <*> nr :: Maybe ([String] -> Maybe MatrixData)
d = join $ p' <*> (Just toks) :: Maybe MatrixData
m = MM <$> d <*> sy :: Maybe Matrix
in ...


. -, (<$>) , (<*>). Maybe-. (<$>) pure ( ) Just ( Maybe) (<*>).

-, , Maybe, Maybe (. p' ), Maybe (Maybe a). join, Maybe a. join Control.Monad. , (join (Just Nothing) Nothing).

-, , , , ( Nothing). , Either e, Applicative.



. -, , , , , . Maybe (<*>) , , .


Flattr this

http://s.arboreus.com/2010/10/avoiding-ifs-and-cases-with-applicative.html

:  

: [1] []
 

:
: 

: ( )

:

  URL