Функциональные языки программирования блок-схемы

блок-схемы. Эта древняя старая практика, которая использовалась уже более 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

Как бы вы проиграли последнюю?

Ответ 1

Я не думаю, что блок-схема, представляющая процессы (поэтому изменение состояний), подходит для FP, который в основном не имеет состояния.

Но я думаю, вы можете показать схему (?).

        ext
       _ | ______________________________________________
      |  |                                               |
      |  `-> [ '.' : ] -------> [ lower ] --.__          |
      |                                      __ [ == ] ----->
name --> [ takeExtension ] ---> [ lower ] --'            |
      |__________________________________________________|
                              f

Вам лучше проконсультироваться с инструктором.

Ответ 2

На самом деле, блок-схемы для использования в программном обеспечении датируются только около 60 лет. (И действительно, программирование, как мы знаем, датируется только 65!). В то время они были невероятно важны как инструмент для планирования и разработки алгоритмов до очень утомительного и подверженного ошибкам этапа "кодирования".

В наши дни наши программирующие языки достигли уровня выразительности, когда цель алгоритма более четко выражена самим кодом. (Возможно, не так много в VisualBasic, но, конечно же, в Haskell). Следовательно, ни один современный магазин программирования не использует блок-схемы.

Однако языки визуального программирования существуют и имеют большой успех в некоторых областях. Эти среды связаны с блок-схемой. Возможно, ваш инструктор действительно готовится выполнить некоторую работу по сравнительному языку программирования и побуждает всех вас думать об этих подходах.

Наконец, к вашей конкретной проблеме, подумайте об этом так: Традиционные блок-схемы в первую очередь продемонстрировали поток контроля через программу, так как это тот тип кода, который люди писали в то время. Тем не менее, всегда наблюдался некоторый объем потока данных. Для функциональной программы вы должны в первую очередь демонстрировать поток данных.

Фокус, однако, заключается в том, как проиллюстрировать поток (частично примененных) функций как данных. Подумайте, что должна делать блок-схема, чтобы поддержать концепцию подпрограммы, которая может быть вызвана в двух местах... Теперь, возможно, вы можете создать подобную графическую конструкцию, чтобы обозначить "функция, идентифицированная Ⓐ потоками в качестве второго аргумента filter" Я представляю себе небольшой лук с надписью fmap с отверстием для отверстия в боковом отверстии для Ⓐ, которое должно быть связано со стрелкой.

Если ничего другого, подумайте об этом как о назначении при изучении альтернативных представлений вашей программы - и если у вас есть расширение блок-схемы (которое никогда не должно было иметь дело с универсальными функциями), и это ясно, ваш инструктор должен предоставить вам дополнительные знаки!

Ответ 3

Hm... Вы можете вручную скомпилировать свой код в представлении на основе суперкомбинаторов, а затем нарисуйте диаграмму, подобную блок-схеме этого приложения суперкомбинаторов. В некоторых случаях это даже полезно сделать, дает некоторое разумное визуальное представление потока. Просто подумайте о потоке данных вместо потока выполнения.

Ответ 4

Ключ с блок-схемами и FP заключается в том, что вы начинаете думать о функциональных потоках. Как вы уже знаете, FP использует функции, вызывающие функции для выполнения заданий. Если у вас нет хорошего изображения того, кто будет звонить кому, с какой информацией вы все равно закончите создание кода спагетти или создаете множество функций, делающих то же самое, что очень затрудняет ваш код.

Создание структурированной диаграммы того, что вы планируете строить, с помощью блок-схемы, описывающей, в каком порядке должны произойти события, вы получите программу, которая может быть легко поддающейся проверке и легче протестировать.

Для тех, кто не знаком с диаграммами структуры, это способ моделирования вызовов функций от вызывающего абонента к получателю с помощью значений отправки и возврата. С его помощью вы можете легко освоить море, если у вас уже есть функция получения данных из файла конфигурации ie и повторного использования в любом месте вашей системы.