문제

대학 2학년 때 우리는 하스켈을 "배웠"습니다. 저는 하스켈에 대해 거의 아무것도 모르고 함수형 프로그래밍에 대해서도 아는 바가 거의 없습니다.

함수형 프로그래밍이란 무엇이며 왜 비함수형 프로그래밍 대신 어디에서 사용하고 싶습니까? C가 비함수형 프로그래밍 언어라고 생각하는 것이 맞습니까?

도움이 되었습니까?

해결책

함수형 언어의 주요 특징 중 하나는 일급 함수 개념입니다.아이디어는 함수를 다른 함수에 매개변수로 전달하고 이를 값으로 반환할 수 있다는 것입니다.

함수형 프로그래밍에는 상태를 변경하지 않는 코드 작성이 포함됩니다.그렇게 하는 주된 이유는 함수를 연속적으로 호출하면 동일한 결과가 나오기 때문입니다.일급 함수를 지원하는 어떤 언어로든 함수 코드를 작성할 수 있지만 상태 변경을 허용하지 않는 Haskell과 같은 일부 언어도 있습니다.사실, 부작용(텍스트 인쇄 등)을 전혀 만들어서는 안 됩니다. 이는 전혀 쓸모가 없는 것처럼 들립니다.

대신 Haskell은 IO에 대해 다른 접근 방식을 사용합니다.모나드.이는 인터프리터의 최상위 수준에서 실행하기를 원하는 IO 작업이 포함된 개체입니다.다른 수준에서는 단순히 시스템의 개체일 뿐입니다.

함수형 프로그래밍은 어떤 이점을 제공합니까?함수형 프로그래밍을 사용하면 각 구성 요소가 완전히 격리되므로 버그 가능성이 적은 코딩이 가능합니다.또한 재귀 및 일류 함수를 사용하면 일반적으로 코드 구조를 반영하는 간단한 정확성 증명이 가능합니다.

다른 팁

함수형 프로그래밍이란?

오늘날 일반적으로 사용되는 "함수형 프로그래밍"에는 두 가지 다른 정의가 있습니다.

(Lisp에서 유래한) 오래된 정의는 함수형 프로그래밍이 일급 함수를 사용하는 프로그래밍에 관한 것이라는 것입니다.여기서 함수는 다른 값처럼 처리되므로 함수를 다른 함수에 인수로 전달할 수 있고 함수는 반환 값 중에서 함수를 반환할 수 있습니다.이는 다음과 같은 고차 함수의 사용으로 귀결됩니다. map 그리고 reduce (당신은 들어봤을 것입니다 mapReduce Google에서 많이 사용하는 단일 작업으로, 당연히 가까운 친척입니다!)..NET 유형 System.Func 그리고 System.Action C#에서 고차 함수를 사용할 수 있도록 합니다.C#에서는 카레링이 비실용적이지만 다른 함수를 인수로 받아들이는 함수가 일반적입니다.그만큼 Parallel.For 기능.

Haskell에 의해 대중화된 더 젊은 정의는 함수형 프로그래밍도 돌연변이를 포함한 부작용을 최소화하고 제어하는 ​​것입니다.표현식을 작성하여 문제를 해결하는 프로그램 작성.이것을 "순수 함수형 프로그래밍"이라고 부르는 것이 더 일반적입니다.이는 "순수한 기능적 데이터 구조"라고 불리는 데이터 구조에 대한 매우 다른 접근 방식을 통해 가능해졌습니다.한 가지 문제는 순전히 함수형 데이터 구조를 사용하도록 전통적인 명령형 알고리즘을 변환하면 일반적으로 성능이 10배 악화된다는 것입니다.Haskell은 유일하게 살아남은 순수 함수형 프로그래밍 언어이지만 이 개념은 다음과 같은 라이브러리를 통해 주류 프로그래밍에 스며들었습니다. Linq .NET에서.

비함수형 프로그래밍 대신 어디에 사용하고 싶나요?

어디에나.C#의 람다는 이제 큰 이점을 보여주었습니다.C++11에는 람다가 있습니다.이제 고차 함수를 사용하지 않을 이유가 없습니다.F#과 같은 언어를 사용할 수 있다면 유형 추론, 자동 일반화, 커링 및 부분 적용(및 기타 다양한 언어 기능)의 이점도 누릴 수 있습니다.

C가 비기능적 프로그래밍 언어라고 생각하는 것이 맞습니까?

예.C는 절차적 언어이다.그러나 함수 포인터를 사용하면 함수형 프로그래밍의 이점 중 일부를 얻을 수 있습니다. void * C에서

이 기사를 확인해 볼 가치가 있습니다. F# "101" CoDe Mag에 최근 게시되었습니다.

또한, Dustin Campbell은 훌륭한 블로그를 가지고 있습니다. 그는 F#의 속도를 높이는 데 대한 그의 모험에 대한 많은 기사를 게시했습니다.

이 내용이 도움이 되길 바랍니다 :)

편집하다:

또한 덧붙이자면 함수형 프로그래밍에 대한 나의 이해는 다음과 같습니다. 모든 것 인스턴스/상태 저장 개체가 아닌 함수 또는 함수에 대한 매개 변수입니다.하지만 제가 틀렸을 수도 있습니다. F#은 정말 알고 싶은데 시간이 없어요!:)

통계학자 John의 예제 코드는 함수형 프로그래밍을 보여주지 않습니다. 왜냐하면 함수형 프로그래밍을 수행할 때 핵심은 코드가 할당을 수행하지 않는다는 것입니다( record = thingConstructor(t) 과제)이며 부작용이 없습니다(localMap.put(record) 부작용이 있는 진술입니다.)이 두 가지 제약의 결과로, 기능 does는 인수와 반환 값으로 완전히 캡처됩니다.C++를 사용하여 기능적 언어를 에뮬레이션하려는 경우 통계학자의 코드를 보이는 대로 다시 작성합니다.

RT getOrCreate(const T thing, 
                  const Function<RT<T>> thingConstructor, 
                  const Map<T,RT<T>> localMap) {
    return localMap.contains(t) ?
        localMap.get(t) :
        localMap.put(t,thingConstructor(t));
}

부작용 없음 규칙의 결과로 모든 명령문은 반환 값의 일부입니다(따라서 return 온다 첫 번째), 모든 문은 표현식입니다.함수형 프로그래밍을 시행하는 언어에서는 return 키워드가 암시되어 있으며, 만약에 명령문은 C++처럼 동작합니다. ?: 운영자.

또한 모든 것이 불변이므로 localMap.put 새 복사본을 만들어야 합니다. 지역지도 원본을 수정하는 대신 반환합니다. 지역지도, 일반적인 C++ 또는 Java 프로그램과 같은 방식입니다.localMap의 구조에 따라 복사본은 원본에 대한 포인터를 재사용하여 복사해야 하는 데이터의 양을 줄일 수 있습니다.

함수형 프로그래밍의 장점 중 일부는 함수형 프로그램이 더 짧고, 함수형 프로그램을 수정하기가 더 쉽고(고려해야 할 숨겨진 전역 효과가 없기 때문에) 프로그램을 바로 실행하기가 더 쉽다는 점을 포함합니다. 처음.

그러나 기능적 프로그램은 (수행해야 하는 모든 복사로 인해) 느리게 실행되는 경향이 있으며 메모리 주소, 리틀 엔디안을 처리하는 다른 프로그램, 운영 체제 프로세스 또는 운영 체제와 잘 상호 작용하지 않는 경향이 있습니다. 바이트 블록 및 기타 기계 관련 비기능 비트.비상호운용성 정도는 기능적 순수성 정도 및 유형 시스템의 엄격성과 반비례하는 경향이 있습니다.

더 널리 사용되는 기능적 언어는 정말, 정말 엄격한 유형 시스템을 가지고 있습니다.OCAML에서는 정수와 부동 소수점 연산을 혼합할 수도 없고 동일한 연산자를 사용할 수도 없습니다(+는 정수를 더하는 것이고, +는 더하기 위한 것입니다).수레를 추가하기 위한 것입니다).이는 특정 종류의 버그를 잡아내는 유형 검사기의 기능을 얼마나 높이 평가하는지에 따라 장점이 될 수도 있고 단점이 될 수도 있습니다.

기능적 언어는 또한 매우 큰 런타임 환경을 갖는 경향이 있습니다.Haskell은 예외입니다(GHC 실행 파일은 컴파일 타임과 런타임 모두에서 거의 C 프로그램만큼 작습니다). 그러나 SML, Common Lisp 및 Scheme 프로그램에는 항상 엄청난 양의 메모리가 필요합니다.

예, C가 비기능적 언어라고 생각하는 것이 맞습니다.C는 절차적 언어이다.

나는 반복적인 작업을 줄이기 위해 좀 더 추상적인 버전을 만든 다음 그것을 대신 사용하는 함수형 프로그래밍을 선호합니다.예를 들어 보겠습니다.Java에서는 구조를 기록하기 위한 맵을 생성하여 getOrCreate 구조를 작성하는 경우가 많습니다.

SomeKindOfRecord<T> getOrCreate(T thing) { 
    if(localMap.contains(t)) { return localMap.get(t); }
    SomeKindOfRecord<T> record = new SomeKindOfRecord<T>(t);
    localMap = localMap.put(t,record);
    return record; 
}

이것은 매우 자주 발생합니다.이제 함수형 언어로 작성할 수 있습니다.

RT<T> getOrCreate(T thing, 
                  Function<RT<T>> thingConstructor, 
                  Map<T,RT<T>> localMap) {
    if(localMap.contains(t)) { return localMap.get(t); }
    RT<T> record = thingConstructor(t);
    localMap = localMap.put(t,record);
    return record; 
}

그리고 나는 이 중 새로운 것을 다시 쓸 필요가 없을 것이고 그것을 물려받을 수 있을 것입니다.하지만 상속하는 것보다 더 나은 것을 할 수 있습니다. 이 것의 생성자에서 말할 수 있습니다.

getOrCreate = myLib.getOrCreate(*,
                                SomeKindOfRecord<T>.constructor(<T>), 
                                localMap);

(여기서 *는 일종의 "이 매개변수를 열어두세요" 표기법으로, 일종의 커링입니다.)

그런 다음 로컬 getOrCreate는 상속 종속성 없이 모든 것을 한 줄에 작성한 경우와 정확히 동일합니다.

F#에서 좋은 글을 찾고 계시다면

전문가 F# Don Syme이 공동 집필했습니다.F#의 창시자.그는 특히 F#을 만들기 위해 .NET에서 제네릭 작업을 했습니다.

F#은 OCaml을 모델로 하므로 모든 OCaml 텍스트는 F#을 배우는 데에도 도움이 됩니다.

내가 찾은 함수형 프로그래밍이란 무엇입니까? 유용하다

기능 프로그래밍은 순수한 기능 작성, 숨겨진 입력 및 출력을 가능한 한 멀리 제거하는 것입니다. 따라서 가능한 많은 코드가 입력과 출력 간의 관계를 설명합니다.

명시적인 것을 선호합니다 when 매개변수

public Program getProgramAt(TVGuide guide, int channel, Date when) {
  Schedule schedule = guide.getSchedule(channel);

  Program program = schedule.programAt(when);

  return program;
}

~ 위에

public Program getCurrentProgram(TVGuide guide, int channel) {
  Schedule schedule = guide.getSchedule(channel);

  Program current = schedule.programAt(new Date());

  return current;
}

기능적 언어는 부작용에 적극적으로 적대적입니다.부작용은 복잡성이고 복잡성은 버그이며 버그는 악마입니다.기능적 언어는 부작용에도 적대적인 태도를 취하는 데 도움이 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top