kouzdra (kouzdra) wrote,
kouzdra
kouzdra

Про functional programming:

Тут завелся вопрос в чем разница между FP и IP (императивным). Пожалуй приведу два примера, которые разницу демонстрируют:

module hello

import StdEnv, StdFile

Start::*World -> *World
Start world =
   let (stdinout ,world1)       = stdio world in
   let (key, stdinout1) = freadline stdinout in
   let stdinout2 = fwrites "\nHello, " stdinout1 in
   let stdinout3 = fwrites "world\n"   stdinout2 in
   let stdinout21 = fwrites "\nGood bye, " stdinout1 in
   let stdinout31 = fwrites "world\n"   stdinout21 in
   let (res, world2) = fclose (if (key == "bye\n") stdinout31 stdinout3) world1 in
   world2

Вот тут вроде бы все похоже на какой-нибудь С. Однако в С схожая программа напечатает и Hello, World и Goodbye World, а проверка условия не сделает ничего. Тут же именно то, какой именно файл закроет fclose определяет то, что на самом деле на экране покажется.

Второй пример банален: конкатенация односвязных списков:
data List a = Nil | Cons a (List a)
catList Nil a = a
catList (Cons a b) c = Cons a (catList b c)

не только много короче чем плюсовое (или жабское):
template <typename T>
struct List {
  T v;
  List<t> const * next;
  List (T v, List<t> const * next): v(v), next(next) { }
};

template<typename T>
List<t> const * catList (List<t> const * a, List<t> const * b) {
  if (a == NULL)
    return b;
  else
    return new List<t>(a -> v, catList (a -> next, b));
}

Но еще и хаскелльный catList имеет сложность O(1), тогда как плюсовый - O(n)
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 65 comments