함수형 프로그래밍은 문제와 솔루션 사이의 '표현 간격'을 증가 시킵니까? [닫은]


18

컴퓨터 언어 (예 : 0110101000110101컴퓨터 언어)는 일반적으로 상위 형태의 추상화로 발전해 왔으므로 일반적으로 문제에 적용될 때 코드를 이해하기가 더 쉽습니다. 어셈블러는 머신 코드에 대한 추상화 였고 C는 어셈블러에 대한 추상화였습니다.

객체 지향 디자인은 객체 측면에서 문제를 모델링하는 데 매우 능숙한 것으로 보입니다. 예를 들어 대학 과정 등록 시스템의 문제는 Course클래스, Student클래스 등 으로 모델링 할 수 있습니다 . 그런 다음 솔루션을 작성할 때 OO 언어로, 우리는 책임을지고 일반적으로 디자인, 특히 코드 모듈화에 도움이되는 비슷한 클래스를 가지고 있습니다. OO 방법으로 문제를 해결하는 10 명의 독립적 인 팀에이 문제를 주면 일반적으로 10 가지 솔루션에 공통적으로 문제와 관련된 클래스가 있습니다. 이러한 클래스의 커플 링 및 상호 작용을 시작할 때 많은 차이가있을 수 있으므로 "제로 표현 간격"과 같은 것은 없습니다.

함수형 프로그래밍에 대한 나의 경험은 매우 제한적입니다 (실제로 사용하지 않고 Hello World 형식의 프로그램 만). 나는 그러한 언어가 어떻게 FP 솔루션을 OO 언어와 같은 문제 (낮은 표현 간격)로 쉽게 매핑 할 수 있는지 알지 못했습니다.

동시 프로그래밍과 관련하여 FP의 장점을 이해합니다. 그러나 나는 무엇인가 빠졌습니까, 아니면 FP는 표현 격차를 줄이는 것이 아닙니다 (솔루션을 이해하기 쉽게 만듭니다)?

이것을 묻는 또 다른 방법 : 같은 실제 문제를 해결하는 10 개의 서로 다른 팀의 FP 코드가 공통점이 많습니까?


Wikipedia on Abstraction (컴퓨터 과학) (강조 광산)에서 :

함수형 프로그래밍 언어는 일반적 으로 람다 추상화 (일부 변수의 함수로 용어 만들기), 고차 함수 (매개 변수는 함수), 괄호 추상화 (항을 변수의 함수로 만들기) 와 같은 함수와 관련된 추상화를 나타냅니다 .

[일부] 실제 문제는 그러한 추상화로 쉽게 모델링되지 않기 때문에 표현 격차가 잠재적으로 증가 할 수 있습니다.


표현 격차가 줄어드는 또 다른 방법은 솔루션 요소를 다시 문제로 추적하는 것입니다. 0의와 1기계 코드 S는 반면, 역 추적하는 것은 매우 어려운 Student클래스는 추적 뒷면에 용이하다. 모든 OO 클래스가 문제 공간을 쉽게 추적하지는 않지만 많은 클래스가 문제 공간을 쉽게 추적합니다.

FP 추상화가 항상 문제 영역의 어느 부분을 해결하기 위해 설명해야 할 필요는 없습니까 ( 수학 문제 제외 )?OK-나는이 부분에 능숙하다. 더 많은 예제를 살펴본 후, 데이터 처리에서 표현되는 문제의 일부에 대해 FP 추상화가 어떻게 매우 명확한 지 알 수 있습니다.


관련 질문에 대한 대답 정답 UML을 사용하여 기능 프로그램을 모델링 할 수 있습니까? "기능 프로그래머는 다이어그램을 많이 사용하지 않습니다." UML인지는 신경 쓰지 않지만 널리 사용되는 다이어그램이없는 경우 (이 답변이 정확하다고 가정) FP 추상화가 이해하기 쉽고 의사 소통이되는지 궁금합니다. 다시 한 번, FP 사용 / 이해 수준은 사소한 것이므로 간단한 FP 프로그램에 대한 다이어그램이 필요하지 않다는 것을 이해합니다.

OO 디자인에는 기능 / 클래스 / 패키지 수준의 추상화가 있으며 각각에 캡슐화 (액세스 제어, 정보 숨기기) 기능이있어 관리가 더 쉽습니다. 이것들은 문제에서 해결책으로 나아가고 더 쉽게 돌아갈 수있게 해주는 요소입니다.


많은 답변에서 OO와 유사한 방식으로 FP에서 분석 및 디자인이 수행되는 방식에 대해 이야기하지만 아무도 지금까지 높은 수준의 내용을 인용 한 사람은 없습니다. 어제 많은 인터넷 검색을 수행하고 흥미로운 토론을 찾았습니다. 다음은 Simon Thompson (2004)의 리팩토링 기능 프로그램 (강조 광산)의 내용입니다.

객체 지향 시스템을 설계 할 때는 설계가 프로그래밍보다 우선합니다. 디자인은 Eclipse와 같은 도구에서 지원되는 UML과 같은 시스템을 사용하여 작성됩니다. 초보자는 BlueJ와 같은 시스템을 사용하여 시각적 디자인 접근 방식을 배울 수 있습니다. 기능 프로그래밍을위한 유사한 방법론에 대한 작업은 FAD : Functional Analysis and Design 에보고되어 있지만 다른 작업은 거의 없습니다. 여기에는 여러 가지 이유가있을 수 있습니다.

  • 기존 기능 프로그램은 규모가 크므로 디자인이 필요하지 않습니다. 많은 기능적 프로그램은 작지만 Glasgow Haskell Compiler와 같은 다른 프로그램도 상당합니다.

  • 기능적 프로그램은 응용 프로그램 도메인을 직접 모델링하므로 설계와 관련이 없습니다. 함수형 언어는 다양한 강력한 추상화를 제공하지만 실제 세계를 모델링하는 데 필요한 추상화 만 제공한다고 주장하기는 어렵습니다.

  • 기능적 프로그램은 진화하는 일련의 프로토 타입으로 제작됩니다.

에서 박사 학위 논문 위에서 언급 , 분석 및 설계 방법론 (ADM)를 사용의 장점은 패러다임의 독립적 인 설명되어 있습니다. 그러나 ADM이 구현 패러다임과 일치해야한다는 주장이 제기되었습니다. 즉, OOADM은 OO 프로그래밍에 가장 적합하며 FP와 같은 다른 패러다임에는 잘 적용되지 않습니다. 다음은 내가 표현상의 차이라고 부르는 것을 역설이라고 생각하는 큰 인용문입니다.

어떤 패러다임이 소프트웨어 개발을위한 최고의 지원을 제공하는지에 관해 오랫동안 논할 수는 있지만, 문제 설명에서 구현 및 전달에 이르는 단일 패러다임 내에 남아있을 때 가장 자연스럽고 효율적이며 효과적인 개발 패키지를 달성 할 수 있습니다.

FAD가 제안한 다이어그램 세트는 다음과 같습니다.

  • 구현에 사용되는 기능을 제공하는 기능 의존성 다이어그램;
  • 유형에 대해 동일한 서비스를 제공하는 유형 종속성 다이어그램. 과,
  • 시스템의 모듈 아키텍처에 대한 뷰를 제공하는 모듈 종속성 다이어그램.

축구 (축구) 리그와 관련된 데이터의 생산을 자동화하는 시스템 인 FAD 논문의 섹션 5.1에 사례 연구가 있습니다. 요구 사항은 100 % 기능적입니다 (예 : 축구 결과 입력, 리그 테이블 생성, 득점 테이블, 출석 테이블, 팀 간 선수 이동, 새로운 결과 후 데이터 업데이트 등) FAD가 작동하지 않는 요구 사항을 해결하는 방법에 대한 언급은 없습니다. "최소한의 비용으로 새로운 기능을 허용해야한다"는 것 외에는 테스트하기가 거의 불가능합니다.

안타깝게도 FAD와는 별도로 FP에 제안 된 모델링 언어 (시각적)에 대한 최신 참조는 없습니다. UML은 또 다른 패러다임이므로이를 잊어야합니다.


1
의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
maple_shaft

답변:


20

기본 데이터는 거의 모든 패러다임에서 동일하게 구성됩니다. 당신은이 겁니다 StudentA, Course그것은 개체, 구조체, 기록, 또는 무엇인지 등. OOP와의 차이점은 데이터가 구성되는 방식이 아니라 함수가 구성되는 방식입니다.

실제로 기능 프로그램이 문제에 대한 생각과 훨씬 더 밀접하게 일치한다는 것을 알았습니다. 예를 들어, 다음 학기의 학생 일정을 계획하려면 학생이 이수한 과정 목록, 학생의 학위 프로그램 과정,이 학기 제공 과정, 학생이 필수 과목을 수료 한 과정, 원하지 않는 시간이있는 과정 등을 고려해야합니다. 충돌하지 않는 등

갑자기 어떤 클래스가 이러한 목록을 만들고 저장해야하는지 명확하지 않습니다. 이 목록의 복잡한 조합이있는 경우에는 더 적습니다. 그러나 하나의 수업을 선택 해야 합니다.

FP에서는 학생과 코스 목록을 가져오고 필터링 된 코스 목록을 반환하는 함수를 작성합니다. 이러한 모든 기능을 모듈로 그룹화 할 수 있습니다. 클래스를 다른 클래스와 연결할 필요는 없습니다.

따라서 데이터 모델은 다른 클래스의 조합에서 작동하는 함수를 배치하는 편리한 위치를 제공하는 것 외에 다른 목적이없는 클래스로 오염되기 전에 OOP 프로그래머가 모델을 어떻게 생각하는지와 비슷하게 보입니다. CourseStudentFilterList당신이 항상 OOP에서 필요로하는 이상 하거나 유사한 클래스는 없지만 시작 디자인에서는 결코 생각하지 않습니다.


5
@ BenAaronson 내 경험의 문제는 학생과 관련된 모든 기능이 Student 클래스에 추가되고 StudentCourseFilterer관리 가 가능하도록 소개해야 할 때까지 책임이 커지고 커진다 는 것입니다.
AlexFoxGill

3
@Den Hybrid 방식에는 장점이 있습니다. 그러나 구별이 인공적이라는 것은 사실이 아닙니다. 스칼라 적절하게 OOP와 FP하기 위해했습니다 타협 많이있다 (덜 강력한 형식 유추는 하나 복잡성이 다른 : 예, 믹스의 OOP와 FP 더 경향이있는 언어입니다. 복잡한 - 사용에 하드 "에서와 같이 이해하십시오 "-두 극단의 순결한 형제 중 하나보다).
Andres F.

3
@Den See Erik Meijer의 ''Mostly Functional '프로그래밍이 작동하지 않습니다.' 는 하이브리드 접근 방식에 반대하고 완전한 "기본주의"FP로 나아가는 것에 반대합니다.
Andres F.

4
@ 덴 당신이 묘사하는 인기는, 나는 역사의 사고입니다. 나는 직장에서 스칼라를 사용하며 FP와 OOP를 혼합하려고 시도하기 때문에 복잡한 짐승입니다. Haskell과 같은 진정한 FP 언어로 전환하는 것은 신선한 공기를 마시고있는 것처럼 느껴집니다. 그리고 저는 학문적 관점에서도 이야기하고 있지 않습니다!
Andres F.

3
@Den 나는 그 기능 중 하나가 무엇을하는지 말할 수 없습니다. FP의 첫 번째 기능은 일종의 또는 필터가 있다면 그러나, 나는 그것이라는 것, 말할 수 필터 또는 정렬 ,하지 func(당신이 그것을 이름처럼 IFilter, 등). 일반적으로 FP에서는 이름을 지정 func하거나 올바른 선택 일 fsort또는 filter올바른 선택 일 때! 예를 들어, func매개 변수로 사용되는 고차 함수를 작성할 때 .
Andres F.

10

몇 년 전에 Java 수업을 들었을 때 우리는 전체 수업에 솔루션을 보여줄 것으로 예상되어 사람들의 생각을 알게되었습니다. 문제를 논리적으로 해결하는 방법 솔루션이 3-4 개의 공통 솔루션으로 클러스터링 될 것으로 예상했습니다. 대신에 30 명의 학생들이 30 가지의 완전히 다른 방식으로 문제를 해결하는 것을 보았습니다.

자연스럽게 프로그래머가 경험을 쌓으면서 일반적인 소프트웨어 패턴에 노출되고 코드에서 이러한 패턴을 사용하기 시작한 다음 솔루션이 몇 가지 최적의 전략으로 통합 될 수 있습니다. 이러한 패턴은 숙련 된 개발자가 통신 할 수있는 기술 언어를 형성합니다.

함수형 프로그래밍을 뒷받침하는 기술 언어는 수학 입니다. 따라서 함수형 프로그래밍을 사용하여 해결하기에 가장 적합한 문제 는 본질적으로 수학 문제입니다. 수학에서는 덧셈과 뺄셈과 같은 비즈니스 솔루션에서 볼 수있는 수학의 종류를 언급하지 않습니다. 오히려 수학 오버플로에서 볼 수있는 수학의 종류 나 Orbitz의 검색 엔진 (Lisp로 작성 됨)에서 볼 수있는 수학의 종류에 대해 이야기하고 있습니다.

이 오리엔테이션에는 실제 프로그래밍 문제를 해결하려는 기능 프로그래머에게 중요한 영향이 있습니다.

  1. 함수형 프로그래밍은 명령형보다 선언적입니다. 그것은 컴퓨터 에게 어떻게해야하는지가 아니라 무엇을해야하는지에 관한 것입니다.

  2. 객체 지향 프로그램은 종종 하향식으로 작성됩니다. 클래스 디자인이 작성되고 세부 사항이 채워집니다. 기능적 프로그램은 종종 상위 레벨 기능으로 결합 된 작고 자세한 기능부터 시작하여 상향식으로 빌드됩니다.

  3. 기능적 프로그래밍은 복잡한 로직 프로토 타입 제작, 유기적으로 변경 및 진화 할 수있는 유연한 프로그램 구성, 초기 설계가 불분명 한 소프트웨어 구축에 이점이 있습니다.

  4. 클래스, 객체 간 메시지 및 소프트웨어 패턴은 모두 비즈니스 도메인에 매핑되고 비즈니스 인텔리전스를 캡처하여 문서화하는 구조를 제공하므로 객체 지향 프로그램이 비즈니스 도메인에 더 적합 할 수 있습니다.

  5. 모든 실제 소프트웨어는 부작용 (I / O)을 생성하기 때문에 순수 기능 프로그래밍 언어는 수학적으로 순수한 (모나드) 상태를 유지하면서 이러한 부작용을 생성하는 메커니즘이 필요합니다.

  6. 기능적 프로그램은 수학적 특성으로 인해보다 쉽게 ​​입증 될 수 있습니다. 하스켈 타입 시스템은 컴파일 타임에 대부분의 OO 언어로는 할 수없는 것을 찾을 수 있습니다.

등등. 컴퓨팅의 많은 것들과 마찬가지로 객체 지향 언어와 기능적 언어는 다른 장단점이 있습니다.

일부 현대 OO 언어는 유용한 기능 프로그래밍 개념 중 일부를 채택하여 두 세계를 모두 활용할 수 있습니다. Linq와이를 지원하기 위해 추가 된 언어 기능이 그 좋은 예입니다.


6
@thepacker : 함수형 프로그래밍 상태가 있습니다. 표현 만 다릅니다. OOP에서는 변경 가능한 변수를 사용하는 반면 함수형 프로그래밍에서는 프로그램을 검사해야 할 때 즉시 생성되는 무한한 상태 스트림을 사용할 수 있습니다. 불행하게도, 상태는 종종 변수가 상태를 나타내는 유일한 방법 인 것처럼 변수 변수로 식별됩니다. 결과적으로 많은 사람들은 가변 변수가없는 프로그래밍 언어는 상태를 모델링 할 수 없다고 생각합니다.
조르지오

12
"따라서, 함수형 프로그래밍을 사용하여 해결하기에 가장 적합한 문제는 본질적으로 수학 문제입니다." 실제로 의미합니다. 디렉토리 구조를 수학 문제로 탐색하고 재귀 함수로 구현하는 것을 볼 수 있지만 고객이 소스 코드를 볼 수 없으므로 파일 시스템에서 파일을 찾는 것과 같은 실제 문제를 해결하는 것입니다. 나는 수학과 수학이 아닌 문제 사이의 인공적인 차이를 발견했다.
조르지오

5
+1이지만 포인트 2와 4에서는 판매되지 않았습니다. 문제를 해결하는 것으로 시작하여 Haskell 튜토리얼과 블로그 게시물을 많이 보았습니다. 모든 값과 함수 정의를 정의되지 않은 상태로 둡니다 (예외를 던지기로 정의 됨). 하스켈 프로그래머는 의미론을 위해 사소한 유형을 추가하는 경향이 있기 때문에 문제를 보다 철저하게 모델링하는 경향이있는 것 같습니다. 예를 들어 SafeStringHTML 이스케이프 된 문자열을 나타내는 유형을 추가하면 일반적으로 효과.
Doval

4
"함수 프로그래밍을 사용하여 해결하기에 가장 적합한 문제는 본질적으로 수학 문제입니다." 그것은 단순히 사실이 아닙니다. Monads의 개념이 범주 이론에서 나온다는 사실은 수학적 작업이 기능적 언어에 가장 자연스럽고 적합하다는 것을 의미하지는 않습니다. 그것은 강하게 형식화 된 기능 언어로 작성된 코드가 수학 사용에 대해 설명되고 분석되고 추론 될 수 있다는 것을 의미합니다. 이것은 Haskell에서 "Barbie Horse Adventures"를 작성하지 못하게하는 강력한 추가 기능입니다.
itsbruce

6
@itsbruce Barbie Horse Adventures는 최고 구경의 진지한 수학적 시뮬레이션이며, FP는 FP를 FP를 불연속 숫자 투영법으로 표현합니다. 일상적인 비즈니스 문제 코딩과 관련이없는 것으로 완전히 무시하십시오.
Jimmy Hoffa

7

나는 중요하다고 생각하고 다른 답변에서 다루지 않은 측면을 강조하고 싶습니다.

우선, 문제와 솔루션 사이의 표현 격차는 프로그래머의 배경과 배경에 따라 프로그래머의 마음에있을 수 있다고 생각합니다.

Robert Harvey가 이미 지적했듯이 OOP와 FP는 서로 다른 두 가지 관점에서 데이터와 운영을보고 서로 다른 트레이드 오프를 제공합니다.

차이점이있는 한 가지 중요한 측면은 소프트웨어를 확장 할 수있는 방법입니다.

데이터 유형 콜렉션과 조작 콜렉션이있는 상황을 고려하십시오 (예 : 다른 이미지 형식이 있고 이미지를 처리하기 위해 알고리즘 라이브러리를 유지 보수 함).

함수형 프로그래밍을 사용하면 소프트웨어에 새로운 작업을 쉽게 추가 할 수 있습니다. 코드의 로컬 변경 만 필요합니다. 즉, 다른 입력 데이터 형식을 처리하는 새 함수를 추가하면됩니다. 반면에 새로운 형식을 추가하는 것이 더 복잡합니다. 이미 구현 한 모든 기능을 변경해야합니다 (로컬이 아닌 변경).

객체 지향 접근 방식은 이와 대칭입니다. 각 데이터 유형은 모든 작업에 대해 자체 구현을 수행하며 런타임시 올바른 구현을 선택해야합니다 (동적 디스패치). 따라서 새로운 데이터 형식 (예 : 새 이미지 형식)을 쉽게 추가 할 수 있습니다. 새 클래스를 추가하고 모든 메서드를 구현하기 만하면됩니다. 반면에 새 작업을 추가하면 해당 작업을 제공하는 데 필요한 모든 클래스가 변경됩니다. 많은 언어에서 인터페이스를 확장하고 인터페이스를 구현하는 모든 클래스를 조정하면됩니다.

확장에 대한 이러한 다른 접근 방식은 OOP가 이러한 작업이 작동하는 데이터 유형 집합보다 덜 자주 변하는 특정 문제에 대해 OOP가 더 적합한 이유 중 하나입니다. 일반적인 예는 GUI입니다. 모든 위젯이 구현해야하는 고정 된 조작 세트 ( paint,, resizemove)와 확장하려는 위젯 콜렉션이 있습니다.

따라서이 측정 기준에 따르면 OOP와 FP는 코드를 구성하는 두 가지 방법입니다. SICP , 특히 2.4.3 절, 표 2.22 및 메시지 전달 단락을 참조하십시오 .

요약 : OOP에서는 데이터를 사용하여 작업을 구성하고 FP에서는 작업을 사용하여 데이터를 구성합니다. 각 접근법은 상황에 따라 강하거나 약합니다. 일반적으로이 둘 중 어느 것도 문제와 솔루션 사이의 표현 격차가 더 큽니다.


1
실제로 방문자 패턴 (OOP)은 FP에 대해 말한 것과 동일한 기능을 제공합니다. 새 클래스를 더 어렵게 만들면서 새 작업을 추가 할 수 있습니다. FP에서 동일한 작업을 수행 할 수 있는지 궁금합니다 (예 : 작업 대신 새 형식 추가).
Euphoric

1
이미지 처리 시나리오가 가장 좋은 예는 아닙니다. 분명히 이미지를 각 이미지 유형에 대한 모든 이미지 처리 항목의 별도 구현을 작성하는 대신 내부 형식으로 변환하고 처리합니까?
Hey

1
@Giorgio 어쩌면 나는이 부분에서 의도 한 의미를 얻지 못할 것이다. "새로운 형식을 추가하는 것이 더 복잡하다. 이미 구현 한 모든 기능을 변경해야한다."
Hey

2
@Hey Giorgio는 소위 Expression Problem을 언급하고있을 것 입니다. "새 형식 추가"는 "데이터 유형에 새 생성자 (일명 'cases') 추가"를 의미합니다.
Andres F.

1
@ 유포 릭 : 나는 세부 사항을 살펴 보지 않았지만 방문자 패턴에 대한 FP 대응자는 Other데이터 유형 의 변형 / 생성자와 다른 경우 를 처리하기 위해 모든 함수에 전달되는 추가 함수 매개 변수를 포함해야합니다 . 물론 OOP 솔루션 (동적 디스패치)과 관련하여 어색하고 덜 자연 스럽습니다. 같은 방식으로 방문자 패턴은 FP 솔루션 (고차 함수)보다 어색하고 자연스럽지 않습니다.
조르지오

5

대부분의 기능적 언어는 객체 지향 언어가 아닙니다. 그렇다고해서 객체가없는 것은 아닙니다 (복잡한 유형의 의미에서 객체와 관련된 특정 기능이 있음). Haskell은 java와 마찬가지로 Lists, Maps, Arrays, 모든 종류의 Tree 및 기타 여러 복잡한 유형을 가지고 있습니다. Haskell List 또는 Map 모듈을 보면 대부분의 동등한 OO 언어 라이브러리 모듈의 메소드와 매우 유사한 함수 세트가 표시됩니다. 코드를 검사하면 일부 유형 (또는 정확한 생성자) 및 모듈의 다른 함수에서만 사용할 수있는 함수를 사용하여 유사한 캡슐화를 찾을 수 있습니다.

Haskell에서 이러한 유형으로 작업하는 방식은 종종 OO 방식과 거의 다릅니다. 하스켈에서는

  null xs
  length xs

그리고 자바에서는

  xs.isEmpty
  xs.length

토마토, 토마토. Haskell 함수는 객체에 연결되어 있지 않지만 유형과 밀접한 관련이 있습니다. “ 하지만 Java에서는 객체의 실제 클래스에 적합한 길이 메소드를 호출 하고 있습니다. 놀람-Haskell은 타입 클래스 (및 다른 것) 와도 다형성 을 수행 합니다 .

하스켈에서, 내가 가지고있는 경우 입니다 - 정수의 집합 -이 컬렉션이리스트 또는 세트 또는 배열이 코드는 문제가되지 않습니다 여부

  fmap (* 2) is

모든 요소가 두 배로 된 컬렉션을 반환합니다. 다형성은 특정 유형에 대한 적절한 함수가 호출 됨을 의미합니다 .

실제로 이러한 예는 실제로 복잡한 유형은 아니지만보다 어려운 문제에도 동일하게 적용됩니다. 기능적 언어로 복잡한 객체를 모델링하고 특정 기능을 이들과 연관시킬 수 없다는 생각은 단순히 잘못된 것입니다.

있습니다 기능과 OO 스타일 사이의 중요하고 의미있는 차이는 있지만, 나는이 대답은 그들과 거래를 할 수 있다고 생각하지는. 기능적 언어가 문제 및 작업의 직관적 인 모델링을 방해하는지 (또는 방해하는지) 물었습니다. 내 대답은 아니오 야.


실제로 Java / C #에서 유형 클래스를 사용할 수 있습니다. 컴파일러가 유형에 따라 올바른 것을 추론하는 대신 함수 사전을 명시 적으로 전달하기 만하면됩니다.
Doval

아, 확실히 윌리엄 쿡 (William Cook)이 말했듯이 코더가 인식하지 못하더라도 많은 OO 코드는 실제로 함수 코드보다 고차 함수를 더 자주 사용합니다.
itsbruce

2
당신은 틀린 구별을하고 있습니다. 리스트는 더 이상 스택, 큐 또는 틱택 토 시뮬레이터보다 비활성 데이터 구조가 아닙니다. 목록은 무엇이든 보유 할 수 있으며 (Haskell에서는 부분적으로 적용되는 기능 일 수 있음) 이러한 것들과 상호 작용할 수있는 방법을 정의합니다. 부분적으로 적용된 함수로 가득 찬 목록을 다른 값 목록에 적용 할 수 있으며 결과는 첫 번째 기능과 두 번째 입력의 모든 가능한 조합을 포함하는 새 목록이됩니다. 그것은 C 구조체 이상의 것입니다.
itsbruce

3
유형은 명령형 / OO보다 기능적 언어에서 더 다양한 것들에 사용됩니다 (한 유형의 시스템은 더 강력하고 일관된 경향이 있습니다). 예를 들어, 유형과 해당 함수는 코드 경로를 형성하는 데 사용됩니다 (예를 들어 여러 기능 언어에 루프에 대한 키워드가없는 이유).
itsbruce

4
@Fuhrmanator "이것이 FP에서 어떻게 이루어지는 지 모르겠습니다."당신이 이해하지 못하는 것을 불평하는 것은 말이되지 않습니다. 그것을 배우고 철저히 이해하면 이해가 될 것입니다. 어쩌면 그것이 헛소리라고 결정하고 다른 사람들이 당신에게 그것을 증명할 필요는 없지만 위와 같은 다른 사람들이 그것을 이해하고 결론에 도달하지 못했을 수도 있습니다. 총 싸움에 칼을 가져간 것 같습니다. 이제 총이 날카롭지 않기 때문에 총이 쓸모 없다고 말하고 있습니다.
Jimmy Hoffa

4

FP는 실제로 표현 격차를 줄이려고 노력합니다.

기능적 언어에서 많이 볼 수있는 것은 언어를 EDSL (Embedded Domain Specific Language )로 작성하는 것입니다 (상향식 디자인 사용 ) . 이를 통해 프로그래밍 언어 내에서 도메인에 자연스러운 방식으로 비즈니스 관심사를 표현할 수있는 수단을 개발할 수 있습니다. Haskell과 Lisp는 이것에 대해 자부심을 가지고 있습니다.

이 능력을 가능하게하는 것의 일부 (모두는 아님)는 기본 언어 자체 내에서 더욱 유연하고 표현력이 있습니다. 일급 함수, 고차 함수, 함수 구성 및 일부 언어의 경우 대수 데이터 형식 (AKA 차별적 조합) 및 연산자 정의 기능을 통해 OOP보다 표현 방법에 대한 유연성이 더 높습니다. 문제 영역에서 물건을 표현하는 더 자연스러운 방법을 찾을 수 있음을 의미합니다. (많은 OOP 언어가 최근에 이러한 기능 중 많은 것을 채택하고 있지는 않다고 말해야합니다.)

* 예, 많은 OOP 언어에서 표준 연산자를 재정의 할 수 있지만 Haskell에서는 새 연산자를 정의 할 수 있습니다!

기능적 언어 (주로 F # 및 Haskell, 일부 Clojure 및 약간의 Lisp 및 Erlang)를 사용한 경험에서, 문제 공간을 OOP보다 언어로, 특히 대수 데이터 형식을 사용하는 것보다 쉽게 ​​매핑 할 수 있습니다. 수업보다 융통성이 있습니다. FP, 특히 Haskell과 함께 시작할 때 루프에 빠진 것은 명령형 또는 OOP 언어에 익숙했던 것보다 조금 더 높은 수준에서 생각하고 일해야한다는 것입니다. 당신도 이것에 조금 빠져있을 수 있습니다.


고객의 비즈니스 관심사는 고차 기능으로 자주 표현되지 않습니다. 그러나 고객은 단 한 줄짜리 사용자 스토리를 작성하고 비즈니스 규칙을 제공 할 수 있습니다 (또는 고객에게 전달할 수 있음). 일류 함수 등으로 매핑되는 문제의 추상화에 도달 할 수있는 (위에서 아래로) 도메인 모델링에 관심이 있습니다. 참고 문헌을 인용 할 수 있습니까? 도메인, 추상화 등의 구체적인 예를 사용할 수 있습니까?
Fuhrmanator

3
@Fuhrmanator 고객은 OOP 및 FP 사용 여부에 관계없이 여전히 한 줄 사용자 스토리 및 비즈니스 규칙을 작성할 수 있습니다 . 고객이 상속, 구성 또는 인터페이스를 이해하기를 기대하는 것보다 고차 함수를 더 이상 이해하지 않을 것으로 기대합니다.
Andres F.

1
@Fuhrmanator 고객이 Java 제네릭 또는 추상 기본 클래스 및 인터페이스와 관련하여 고객의 우려를 얼마나 자주 표현하셨습니까? 신 이시여 Paul은 당신에게 아주 좋은 대답을했으며, 시각화하기 어려운 기술을 사용하여 실용적이고 신뢰할 수있는 모델링 방법을 설명했습니다. 그럼에도 불구하고 디자인을 표현하는 가장 자연스러운 방법과 다른 방법으로 표현할 수있는 것처럼 하나의 특정 패러다임에 대해 하나의 특정 모델링 기술로 설명해야한다고 주장합니다.
itsbruce

@Fuhrmanator 이것은 당신이 찾고있는 수준은 아니지만 기능적 기술을 사용하여 디자인 프로세스에 대한 통찰력을 제공해야합니다 : Designing With Types . 훌륭한 기사가 있기 때문에 해당 사이트를 일반적으로 탐색하는 것이 좋습니다.
paul

@Fuhrmanator이 Thinking Functionally 시리즈도 있습니다
paul

3

Niklaus Wirth가 말했듯이 "알고리즘 + 데이터 구조 = 프로그램". 함수형 프로그래밍은 알고리즘을 구성하는 방법에 관한 것이며 데이터 구조를 구성하는 방법에 대해서는 많이 설명하지 않습니다. 실제로, 가변 (Lisp) 및 불변 (Haskell, Erlang) 변수를 가진 FP 언어가 있습니다. FP를 다른 것과 비교하고 대조하려면 명령형 (C, Java) 및 선언적 (Prolog) 프로그래밍을 선택해야합니다.

반면에 OOP는 데이터 구조를 구축하고 알고리즘을 연결하는 방법입니다. FP는 OOP와 유사한 데이터 구조를 구축하는 것을 방해하지 않습니다. 당신이 나를 믿지 않는다면, Haskell 타입 선언을 살펴보십시오. 그러나 대부분의 FP 언어는 함수가 데이터 구조에 속하지 않으며 동일한 네임 스페이스에 있어야한다는 데 동의합니다. 이것은 함수 구성을 통해 새로운 알고리즘을 단순화하기 위해 수행됩니다. 실제로 함수가 어떤 입력을 가져오고 어떤 출력을 생성하는지 안다면 왜 어떤 데이터 구조에 속해야합니까? 예를 들어 addInteger 유형의 인스턴스에서 함수를 호출하고 단순히 두 개의 Integer 인수를 전달하는 대신 인수를 전달해야하는 이유는 무엇입니까?

따라서 왜 FP가 솔루션을 일반적으로 이해하기 어렵게 만들어야하는지 알지 못하며 어쨌든 그렇게 생각하지 않습니다. 그러나 노련한 명령형 프로그래머는 반드시 명령형 프로그램보다 이해하기 어려운 기능성 프로그램을 찾을 수 있으며 그 반대도 마찬가지입니다. 이는 Windows 환경에 익숙해지기 위해 10 년 동안 투자 한 사람들이 한 달의 사용 후에 Linux를 사용하기 어려워 Linux에서 익숙한 사람들이 Windows에서 동일한 생산성을 달성 할 수없는 경우 Windows-Linux 이분법과 유사합니다. 따라서, 당신이 말하는 '표현 격차'는 매우 주관적입니다.


OO 원칙이 아닌 캡슐화 및 데이터 숨기기로 인해 OO가 데이터 구조 + 알고리즘 (내부 관점 만)이라는 것에 전적으로 동의하지 않습니다. 좋은 추상화의 장점은 너무 많은 세부 사항을 이해할 필요없이 문제의 일부를 해결하기 위해 제공되는 서비스가 있다는 것입니다. FP에서 함수와 데이터를 분리 할 때 캡슐화를 말하는 것 같지만 확실히 알기에는 너무 녹색입니다. 또한 솔루션에서 문제로의 추적 (표현 간격의 의미를 명확히하기 위해)을 참조하도록 질문을 편집했습니다.
Fuhrmanator

if you know what input a function takes and what output it produces, why should it matter which data structure it belongs too?그것은 응집력처럼 들리는데, 어떤 모듈 시스템에도 중요합니다. 함수를 어디에서 찾을 지 모르면 솔루션을 이해하기가 어려워지고 표현 간격이 더 커지기 때문이라고 주장합니다. 많은 OO 시스템에는이 문제가 있지만 디자인이 좋지 않기 때문입니다 (낮은 응집력). 다시 말하지만 네임 스페이스 문제는 FP에 대한 전문 지식이 아니기 때문에 소리가 나쁘지 않을 수도 있습니다.
Fuhrmanator

1
@Fuhrmanator하지만 당신은 경우 함수를 찾을 알고있다. 그리고 각 데이터 유형에 대해 정의 된 동일한 이름을 가진 여러 함수가 아닌 하나의 함수 만 있습니다 (다시 말하면 "표현 문제"참조). 예를 들어, (대신했다 기능에 약간 덜 유용한 버전의 바퀴를 재발견 또는 만드는, 사용을 권장하고) 하스켈 라이브러리 함수를 들어, 같은 훌륭한 검색 도구가 Hoogle 당신이 할 수 있도록 강력 검색을 서명으로 (시도해보십시오!)
Andres F.

1
@Fuhrmanator, "그것이 응집력처럼 들린다"고 생각하면, FP 언어로 응집력이 더 높은 프로그램을 작성할 수 있다고 논리적으로 결론을 내릴 수 있었지만 나를 놀랐습니다. :-) 나는 당신이 FP 언어를 선택하고 배우고 스스로 결정해야한다고 생각합니다. 내가 당신이라면 Haskell로 시작하는 것이 좋습니다. 순수하기 때문에 명령형 스타일로 코드를 작성할 수는 없습니다. Erlang과 일부 Lisp도 좋은 선택이지만 다른 프로그래밍 스타일과 혼합되어 있습니다. Scala와 Clojure, IMO는 시작하기가 매우 복잡합니다.
mkalkov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.