Составление блок-схем. Эта древняя старая практика это использовалось больше 1 000 лет теперь, будучи вынужденным на нас бедные студенты, без любой полноценности (или так, я думаю). Это могло бы работать хорошо с императивом, последовательно рабочими языками, но что относительно моего любимого функционального программирования?
К сожалению, я вынужден создать блок-схему для своей программы (который записан в Haskell).
Я воображаю это являющийся легким для чего-то вроде этого:
main :: IO ()
main = do
someInput <- getLine
let upped = map toUpper someInput
putStrLn upped
Который является всего 3 упорядоченными шагами, выбирающими данными, uppercasing это, производя его.
Вещи выглядят хуже на этот раз:
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
Как был бы Вы блок-схема, которые длятся тот?
Я не думаю, что блок-схема, которая представляет процессы (следовательно, смену состояний), подходит для FP, которая в основном не имеет состояния.
Но я думаю, что вы можете показать схему (?).
ext
_ | ______________________________________________
| | |
| `-> [ '.' : ] -------> [ lower ] --.__ |
| __ [ == ] ----->
name --> [ takeExtension ] ---> [ lower ] --' |
|__________________________________________________|
f
Вам лучше проконсультироваться с преподавателем.
На самом деле, блок-схемы для использования в программном обеспечении появились всего около 60 лет назад. (И действительно, программированию в том виде, в каком мы его знаем, насчитывается всего 65 лет!) В то время они были невероятно важны как инструмент для планирования и разработки алгоритмов до очень утомительного и подверженного ошибкам этапа «кодирования».
В наши дни наши языки программирования достигли такого уровня выразительности, когда цель алгоритма более четко выражается в самом коде. (Возможно, не так много в VisualBasic, но определенно в Haskell.) Следовательно, ни один современный магазин программирования не использует блок-схемы.
Однако языки визуального программирования существуют и имеют большой успех в некоторых областях. Эти среды связаны с блок-схемами. Возможно, ваш инструктор действительно готовится выполнить некоторый объем работы по сравнительному языку программирования и побуждает всех вас задуматься об этих подходах.
Наконец, что касается вашей конкретной проблемы, подумайте об этом следующим образом: традиционные блок-схемы в первую очередь демонстрируют поток управления через программу, поскольку именно такой код люди писали в то время. Однако всегда был проиллюстрирован некоторый поток данных. Для функциональной программы вы в первую очередь демонстрируете поток данных.
Хитрость заключается в том, чтобы выяснить, как проиллюстрировать поток (частично применяемых) функций в виде данных. Подумайте, что должна делать блок-схема для поддержки концепции подпрограммы, которая может быть вызвана в двух местах ... Теперь, возможно, вы можете создать аналогичную графическую конструкцию, чтобы обозначить, что функция, обозначенная Ⓐ, входит в качестве второго аргумента filter
«Я представляю небольшой лук с надписью fmap
с вырезанной сбоку замочной скважиной для соединения Ⓐ со стрелкой.
По крайней мере, воспринимайте это как задание по изучению альтернативных представлений вашей программы - и если у вас есть расширенная блок-схема (которая никогда не имела дело с универсальными функциями), и проясните это, ваш инструктор должен дать вам дополнительные Метки!
Хм ... Вы можете вручную скомпилировать свой код в представление на основе суперкомбинаторов, а затем нарисовать граф в виде блок-схемы этого приложения суперкомбинаторов. В некоторых случаях это даже полезно, так как это дает разумное визуальное представление потока. Просто подумайте о потоке данных, а не о потоке выполнения.