program story

일하는 사람을위한 결합 자 설명

inputbox 2020. 9. 6. 09:55
반응형

일하는 사람을위한 결합 자 설명


콤비 네이터 란 ??

그것은이다 "아니오 자유 변수와 함수 나 정의" (SO에 정의 된대로)는?

또는 이것은 어떨까요? Arrows에 대한 그의 잘 알려진 논문에서 John Hughes따르면 , "결합기는 프로그램 단편으로부터 프로그램 단편을 구축하는 함수입니다." , 이는 "... 결합기를 사용하는 프로그래머가 원하는 것을 많이 구성합니다. 모든 세부 사항을 손으로 작성하지 않고 자동으로 프로그램합니다. " 그는 말을 계속 map하고 filter같은 콤비의 두 가지 일반적인 예입니다.

첫 번째 정의와 일치하는 일부 결합 자 :

  • 에스
  • 케이
  • 와이
  • To Mock a Mockingbird의 다른 사람들 (내가 틀렸을 수 있습니다-이 책을 읽지 않았습니다)

두 번째 정의와 일치하는 일부 결합 자 :

  • 지도
  • 필터
  • 접기 / 축소 (아마도)
  • >> =, compose, fmap ????? 중 하나

나는 첫 번째 정의에 관심이 없다. 그것들은 내가 실제 프로그램을 작성하는 데 도움이되지 않을 것이다 (내가 틀렸다고 확신한다면 +1). 두 번째 정의를 이해하도록 도와주세요 . 맵, 필터 및 축소가 유용하다고 생각합니다.이를 통해 더 높은 수준에서 프로그래밍 할 수 있습니다. 실수를 줄이고 더 짧고 명확한 코드를 작성할 수 있습니다. 다음은 결합 자에 대한 몇 가지 구체적인 질문입니다.

  1. 지도, 필터와 같은 결합 자의 더 많은 예는 무엇입니까?
  2. 프로그래밍 언어가 자주 구현하는 결합자는 무엇입니까?
  3. 결합자는 더 나은 API를 설계하는 데 어떻게 도움이됩니까?
  4. 효과적인 결합자를 어떻게 설계합니까?
  5. 비 기능적 언어 (예 : Java)와 유사한 결합자는 무엇입니까? 아니면 이러한 언어가 결합 자 대신 무엇을 사용합니까?

최신 정보

@CA McCann 덕분에 이제 결합 자에 대해 좀 더 잘 이해하게되었습니다. 그러나 한 가지 질문은 여전히 ​​저에게있어 어려운 점입니다.

결합자를 많이 사용하여 작성된 기능 프로그램과없는 프로그램의 차이점은 무엇입니까?

대답은 combinator-heavy 버전이 더 짧고 명확하고 더 일반적이라는 것입니다.하지만 가능하다면 좀 더 깊이있는 토론을 부탁드립니다.

또한 fold일반적인 프로그래밍 언어에서 복잡한 결합 자 (즉,보다 복잡함 )에 대한 더 많은 예제와 설명을 찾고 있습니다.


나는 첫 번째 정의에 관심이 없다. 그것들은 내가 실제 프로그램을 작성하는 데 도움이되지 않을 것이다 (내가 틀렸다고 확신한다면 +1). 두 번째 정의를 이해하도록 도와주세요. 맵, 필터 및 축소가 유용하다고 생각합니다.이를 통해 더 높은 수준에서 프로그래밍 할 수 있습니다. 실수를 줄이고 더 짧고 명확한 코드를 작성할 수 있습니다.

두 가지 정의는 기본적으로 동일합니다. 첫 번째는 공식적인 정의를 기반으로하며 사용자가 제공하는 예제는 가능한 가장 작은 빌딩 블록 인 기본 결합 자 입니다. 더 정교한 결합자를 구축 할 수있는 한 실제 프로그램을 작성하는 데 도움이 될 수 있습니다. S와 K와 같은 결합자를 가상 "결합 컴퓨터"의 기계어로 생각하십시오. 물론 실제 컴퓨터는 그런 방식으로 작동하지 않으므로 실제로는 일반적으로 다른 방식으로 장면 뒤에서 더 높은 수준의 작업을 구현하지만 개념적 기반은 여전히 높은 수준 의미 를 이해하는 데 유용한 도구입니다. 작업.

두 번째 정의는 더 비공식적이며 다양한 방식으로 다른 기능을 결합하는 고차 함수의 형태로 더 정교한 결합자를 사용하는 것에 관한 것입니다. 기본 빌딩 블록이 위의 기본 결합자인 경우이 블록으로 빌드 된 모든 것은 고차 함수이자 결합 자이기도합니다. 그러나 다른 프리미티브가 존재하는 언어에서는 함수가 아닌 것 사이에 차이가 있습니다.이 경우 결합자는 일반적으로 다른 기능을 작동하지 않고 일반적인 방식으로 조작하는 함수로 정의됩니다. 직접 기능합니다.

지도, 필터와 같은 결합 자의 더 많은 예는 무엇입니까?

나열하기에는 너무 많습니다! 둘 다 단일 값의 동작을 설명하는 함수를 전체 컬렉션의 동작을 설명하는 함수로 변환합니다. 종단 간 구성 또는 인수 분할 및 재결합과 같이 다른 함수 변환하는 함수도있을 수 있습니다 . 단일 단계 작업을 컬렉션을 생성하거나 소비하는 재귀 작업으로 바꾸는 결합자를 가질 수 있습니다. 아니면 모든 종류의 다른 것들도 요.

프로그래밍 언어가 자주 구현하는 결합자는 무엇입니까?

그것은 상당히 다를 것입니다. 완전히 일반적인 결합 자 (대부분 위에서 언급 한 원시 결합 자)가 거의 없기 때문에 대부분의 경우 결합자는 사용중인 데이터 구조에 대해 어느 정도 인식 할 것입니다 (어쨌든 데이터 구조가 다른 결합 자로 구축 된 경우에도). 일반적으로 소수의 "완전히 일반적인"결합자가 있고 그 다음 누군가가 제공하기로 결정한 다양한 특수 형식이 있습니다. (적절하게 일반화 된 버전의) map, fold 및 unfold가 원하는 거의 모든 작업을 수행하기에 충분한 경우가 엄청나게 많습니다.

결합자는 더 나은 API를 설계하는 데 어떻게 도움이됩니까?

당신이 말했듯이, 낮은 수준의 세부 사항 대신 높은 수준의 작업과 상호 작용하는 방식으로 생각함으로써.

Think about the popularity of "for each"-style loops over collections, which let you abstract over the details of enumerating a collection. These are just map/fold operations in most cases, and by making that a combinator (rather than built-in syntax) you can do things such as take two existing loops and directly combine them in multiple ways--nest one inside the other, do one after the other, and so on--by just applying a combinator, rather than juggling a whole bunch of code around.

How do I design effective combinators?

First, think about what operations make sense on whatever data your program uses. Then think about how those operations can be meaningfully combined in generic ways, as well as how operations can be broken down into smaller pieces that are connected back together. The main thing is to work with transformations and operations, not direct actions. When you have a function that just does some complicated bit of functionality in an opaque way and only spits out some sort of pre-digested result, there's not much you can do with that. Leave the final results to the code that uses the combinators--you want things that take you from point A to point B, not things that expect to be the beginning or end of a process.

What are combinators similar to in a non-functional language (say, Java), or what do these languages use in place of combinators?

Ahahahaha. Funny you should ask, because objects are really higher-order thingies in the first place--they have some data, but they also carry around a bunch of operations, and quite a lot of what constitutes good OOP design boils down to "objects should usually act like combinators, not data structures".

So probably the best answer here is that instead of combinator-like things, they use classes with lots of getter and setter methods or public fields, and logic that mostly consists of doing some opaque, predefined action.

참고URL : https://stackoverflow.com/questions/7533837/explanation-of-combinators-for-the-working-man

반응형