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

Если Ваше приложение является интенсивной графикой, как говорят игру, производительность средства моделирования НЕ напоминает во всем то из аппаратных средств. Ваше приложение, вероятно, будет гладким и работать отлично на средстве моделирования, но на аппаратных средствах это, вероятно, представит при проверке, если Вы не будете знать что Ваше выполнение. Можно легко пойти от 60 футов в секунду до 3 футов в секунду между Средством моделирования и аппаратными средствами.

8
задан Bubba88 8 October 2009 в 09:35
поделиться

6 ответов

Насколько хорош "чистый" функционал программирование для основной рутины реализации, например сортировка списков, string matching etc.?

Very. I'll do your problems in Haskell, and I'll be slightly verbose about it. My aim is not to convince you that the problem can be done in 5 characters (it probably can in J!), but rather to give you an idea of the constructs.

import Data.List -- for `sort`
stdlistsorter :: (Ord a) => [a] -> [a]
stdlistsorter list = sort list

Sorting a list using the sort function from Data.List

import Data.List -- for `delete`
selectionsort :: (Ord a) => [a] -> [a]
selectionsort [] = []
selectionsort list = minimum list : (selectionsort . delete (minimum list) $ list)

Selection sort implementation.

quicksort :: (Ord a) => [a] -> [a]  
quicksort [] = []  
quicksort (x:xs) =   
    let smallerSorted = quicksort [a | a <- xs, a <= x]  
        biggerSorted = quicksort [a | a <- xs, a > x]
    in  smallerSorted ++ [x] ++ biggerSorted  

Quick sort implementation.

import Data.List -- for `isInfixOf`
stdstringmatch :: (Eq a) => [a] -> [a] -> Bool
stdstringmatch list1 list2 = list1 `isInfixOf` list2

String matching using isInfixOf function from Data.list

It's common to implement such basic functions within the base interpreter of any functional language, which means that they will be written in an imperative language (c/c++). Although there are many exceptions..

Depends. Some functions are more naturally expressed imperatively. However, I hope I have convinced you that some algorithms are also expressed naturally in a functional way.

At least, I wish to ask: How difficult is it to emulate imperative style while coding in 'pure' functional language?

It depends on how hard you find Monads in Haskell. Personally, I find it quite difficult to grasp.

7
ответ дан 5 December 2019 в 10:42
поделиться

Почти все языки функционального программирования имеют некоторую конструкцию, позволяющую осуществлять императивное кодирование (например, do в Haskell). Есть много проблемных областей, которые нельзя решить с помощью «чистого» функционального программирования. Один из них - сетевые протоколы, например, когда вам требуется последовательность команд в правильном порядке. И такие вещи плохо поддаются чистому функциональному программированию.

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

1
ответ дан 5 December 2019 в 10:42
поделиться

Это работает довольно хорошо, наоборот, эмуляция функционала в императивном стиле.

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

Но нет проблем с выполнением всей базовой реализации алгоритма - тот, который вы упомянули, является НЕ низким уровнем - они являются базовыми.

0
ответ дан 5 December 2019 в 10:42
поделиться

I don't know about list sorting, but you'd be hard pressed to bootstrapp a language without some kind of string matching in the compiler or runtime. So you need that routine to create the language. As there isn't a great deal of point writing the same code twice, when you create the library for matching strings within the language, you call the code written earlier. The degree to which this happens in successive releases will depend on how self hosting the language is, but unless that's a strong design goal there won't be any reason to change it.

0
ответ дан 5 December 2019 в 10:42
поделиться

Это часть SDK (.NET, или теперь Windows SDK )

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

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

См. также

Как функциональное программирование влияет на структуру вашего кода?

1
ответ дан 5 December 2019 в 10:42
поделиться

1) По какому стандарту подходит? Какие свойства вы хотите?

Сортировка списка? Легко. Давайте сделаем быструю сортировку на Haskell:

sort [] = []
sort (x:xs) = sort (filter (< x) xs) ++ [x] ++ sort (filter (>= x) xs)

Этот код имеет то преимущество, что он чрезвычайно прост для понимания. Если список пуст, он отсортирован. В противном случае вызовите первый элемент x, найдите элементы меньше x и отсортируйте их, найдите элементы больше x и отсортируйте их. Затем объедините отсортированные списки с x посередине. Попробуйте сделать это понятным в C ++.

Конечно, Mergesort намного быстрее сортирует связанные списки, но код также в 6 раз длиннее.

2) Очень легко реализовать императивный стиль, оставаясь при этом чисто функциональным. Суть императивного стиля - последовательность действий. Действия упорядочены в чистой настройке с использованием монад. Суть монад - это функция привязки:

(Monad m) => (>>=) :: m a -> (a -> m b) -> m b

Эта функция существует в C ++ и называется ; .

Последовательность действий в Haskell, например, записывается следующим образом:

putStrLn "What's your name?" >>=
  const (getLine >>= \name -> putStrLn ("Hello, " ++ name))

Доступен некоторый синтаксический сахар, чтобы это выглядело более привлекательно. обязательно (но обратите внимание, что это тот же код ):

do {
  putStrLn "What's your name?";
  name <- getLine;
  putStrLn ("Hello, " ++ name);
}
7
ответ дан 5 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: