2010-05-03 5 views
11

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

Почему вы вынуждены составлять блок-схему для программы в Haskell? –

+5

@David: Возможно, что-то вроде «Assignment A: Создайте следующую программу на выбранном вами языке. Назначение B: Сделайте блок-схему для вашей программы» – sepp2k

+0

Блок-схемы не работают хорошо с ленивой оценкой, а? –

ответ

12

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

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

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

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

+0

Да, и эти «схемы» образуют категорию. Все, что может быть помещено в схемы, можно отнести в рамки стрелок в Haskell. –

2

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

+0

данные поток !!!!! –

4

Фактически, flowcharts для использования в программном обеспечении датируется только около 60 лет. (И действительно, программирование, как мы знаем, датируется только 65!). В то время они были невероятно важны как инструмент для планирования и разработки алгоритмов до очень утомительного и подверженного ошибкам этапа «кодирования».

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

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

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

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

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

1

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

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

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

Смежные вопросы