Skip to content

Latest commit

 

History

History
43 lines (34 loc) · 1.13 KB

Do.md

File metadata and controls

43 lines (34 loc) · 1.13 KB

Do notation

Cheatsheet

Haskell TypeScript
a <- action bind('a', (scope) => action)
_ <- action chainFirst((scope) => action)
return ... map((scope) => ...)

Example

Haskell

nameDo :: IO ()
nameDo = do putStrLn "What is your first name? "
            first <- getLine
            putStrLn "And your last name? "
            last <- getLine
            let full = first ++ " " ++ last
            putStrLn ("Pleased to meet you, " ++ full ++ "!")

TypeScript

import { pipe } from 'fp-ts/function'
import * as T from 'fp-ts/Task'

declare const putStrLn: (s: string) => T.Task<void>
declare const getLine: T.Task<string>

const nameDo: T.Task<void> = pipe(
  T.Do,
  T.chainFirst(() => putStrLn('What is your first name? ')),
  T.bind('first', () => getLine),
  T.chainFirst(() => putStrLn('And your last name? ')),
  T.bind('last', () => getLine),
  T.bind('full', ({ first, last }) => T.of(first + ' ' + last)),
  T.chain(({ full }) => putStrLn('Pleased to meet you, ' + full + '!'))
)