52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 280

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 280

a <- ma

=>

ma >>= (\a -> exp)

exp

do

exp1

=>

exp1 >> exp2

exp2

do

let x = fx

=>

let x = fx

y = fy

y = fy

exp

in

exp

Переведём с помощью этих правил определение для второго уравнения из функции sequence

sequence (mx:mxs) = do

x

<- mx

mx >>= (\x -> do

xs

<- sequence mxs

=>

xs <- sequence mxs

=>

return (x:xs)

return (x:xs))

=>

mx >>= (\x -> sequence mxs >>= (\xs -> return (x:xs)))

do или Applicative?

С появлением класса Applicative во многих случаях do-нотация теряет свою ценность. Так например

любой do-блок вида:

f mx my = do

x <- mx

y <- my

return (op x y)

Можно записать гораздо короче:

f = liftA2 op

Например напишем функцию, которая объединяет два файла в один:

appendFiles :: FilePath -> FilePath -> FilePath -> IO ()

С помощью do-нотации:

appendFiles file1 file2 resFile = do

a <- readFile file1

b <- readFile file2

writeFile resFile (a ++ b)

А теперь с помощью класса Applicative:

appendFiles file1 file2 resFile = writeFile resFile =<<