блок-схемы. Эта древняя старая практика, которая использовалась уже более 1000 лет, навязана нам бедными учениками, без какой-либо пользы (или так я думаю). Это может хорошо работать с императивными, последовательно работающими языками, но как насчет моего любимого функционального программирования?
К сожалению, я вынужден создать блок-схему моей программы (написанной в Haskell).
Я предполагаю, что это легко для чего-то вроде этого:
main :: IO ()
main = do
someInput <- getLine
let upped = map toUpper someInput
putStrLn upped
Это всего лишь 3 последовательных шага, выборка данных, их верхняя часть, вывод из нее.
На этот раз все выглядит хуже:
main :: IO ()
main = do
someInput <- fmap toUpper getLine
putStrLn someInput
Или вот так:
main :: IO ()
main = interact (map toUpper)
Хорошо, это был IO, вы можете справиться с этим, как императивный язык. Что относительно чистых функций?
Фактический пример:
onlyMatching :: String -> [FilePath] -> [FilePath]
onlyMatching ext = filter f
where f name = lower ('.' : ext) == (lower . takeExtension $ name)
lower = map toLower
Как бы вы проиграли последнюю?