program story

Ruby는 기능적인 언어입니까?

inputbox 2020. 9. 16. 07:40
반응형

Ruby는 기능적인 언어입니까?


Wikipedia는 Ruby가 기능적 언어라고 말하지만 확신하지 못합니다. 그 이유는 무엇?


루비에서 기능적인 스타일을 사용할 수 있다고 생각합니다.

기능적 스타일로 프로그래밍 할 수있는 가장 중요한 측면 중 하나는 언어가 고차원 함수를 지원하는지 여부입니다.

즉, Ruby에서 비 기능적 스타일로 프로그래밍하는 것도 쉽습니다. 함수 스타일의 또 다른 주요 측면은 상태가없고 주어진 입력 세트에 대해 항상 동일한 값을 반환하는 실제 수학 함수를 갖는 것입니다. 이것은 Ruby에서 수행 될 수 있지만 Haskell과 같이 더 엄격하게 기능하는 것과 같은 언어에서는 시행되지 않습니다.

예, 기능적 스타일을 지원하지만 비 기능적 스타일로 프로그래밍 할 수도 있습니다.


언어가 기능적 언어인지 아닌지 여부는 중요하지 않습니다. 함수형 프로그래밍은 Philip Wadler (함수 프로그래밍의 본질)와 John Hughes (함수 프로그래밍이 중요한 이유)가 가장 잘 설명한 논문입니다.

의미있는 질문은 '루비가 함수형 프로그래밍의 주제를 달성하는 데 얼마나 도움이 되는가?'입니다. 대답은 '매우 나쁨'입니다.

나는 최근에 이것에 대해 이야기했습니다. 다음은 슬라이드입니다.


Ruby는 더 높은 수준의 함수를 지원하지만 (Array # map, inject, & select 참조) 여전히 명령형 객체 지향 언어입니다.

기능적 언어의 주요 특징 중 하나는 변경 가능한 상태를 피한다는 것입니다. 기능적 언어에는 Ruby, C, Java 또는 기타 명령형 언어에서와 같이 변수 개념이 없습니다.

기능적 언어의 또 다른 주요 특징은 "어떻게"가 아닌 "무엇"의 관점에서 프로그램을 정의하는 데 초점을 맞추는 것입니다. OO 언어로 프로그래밍 할 때 우리는 "what"(클래스 / 메서드 이름)에서 구현 ( "어떻게")을 숨기는 클래스와 메서드를 작성하지만 결국 이러한 메서드는 여전히 일련의 명령문을 사용하여 작성됩니다. 기능적 언어에서는 최하위 수준에서도 실행 순서를 지정하지 않습니다.


나는 지원하거나 기능적인 스타일 의 언어로 프로그래밍 할 수있는 능력 이 기능적 언어를 만드는 것이 아니라고 제출합니다.

난 내 동료들에게 상처를하려는 경우 기능적인 스타일로 자바 코드를 작성하고, 자신을 몇 수 개월 에 주.

기능적 언어를 갖는 것은 고차 함수, 일류 함수 및 커링과 같이 있는 일 뿐만이 아닙니다 . 또한 순수 함수의 부작용과 같이 수없는에 관한 것 입니다.

이것은 기능적 프로그램이있는 이유 또는 generel의 기능 코드가 추론하기 쉬운 이유의 큰 부분이기 때문에 중요합니다. 그리고 코드를 추론하기가 더 쉬우면 버그가 더 얕아지고 수정할 수있는 개념적 표면으로 떠오르 기 때문에 버그가 적은 코드가 생성됩니다.

루비의 핵심은 객체 지향적이므로 기능적 스타일을 상당히 잘 지원하더라도 그 자체가 기능적 언어는 아닙니다.

어쨌든 그것은 나의 비과학적인 의견입니다.

편집 : 회고하여 지금 까지이 답변에 대해받은 훌륭한 의견을 고려하여 객체 지향 대 기능 비교는 사과와 오렌지 중 하나라고 생각합니다.

진정한 차별화 요소는 실행에있어서 명령 적이거나 그렇지 않다는 것입니다. 기능 언어는 표현을 기본 언어 구조로 사용하며 실행 순서는 종종 정의되지 않거나 게으른 것으로 정의됩니다. 엄격한 실행이 가능하지만 필요한 경우에만 사용됩니다. 명령형 언어에서는 엄격한 실행이 기본값이며 지연 실행이 가능하지만 종종 수행하기 어렵고 많은 경우에 예측할 수없는 결과가 발생할 수 있습니다.

자, 그것은 나의 비과학적인 의견입니다.


Ruby가 "진정하게"작동하려면 다음 요구 사항을 충족해야합니다.

불변 값 : "변수"가 설정되면 변경할 수 없습니다. Ruby에서는 변수를 상수처럼 효과적으로 처리해야합니다. 는 언어에서 완전히 지원되지 않으므로 각 변수를 수동으로 고정해야합니다.

부작용 없음 : 주어진 값이 전달되면 함수는 항상 동일한 결과를 반환해야합니다. 이것은 불변의 값을 갖는 것과 밀접한 관련이 있습니다. 함수는 결과를 반환하는 데 접선적인 부작용이 발생하므로 값을 취하여 변경할 수 없습니다.

고차 함수 : 함수를 인수로 허용하거나 함수를 반환 값으로 사용하는 함수입니다. 이것은 틀림없이 모든 기능 언어의 가장 중요한 기능 중 하나입니다.

Currying : 고차 함수에 의해 활성화되는 currying은 여러 인수를받는 함수를 하나의 인수를받는 함수로 변환합니다. 이것은 부분 함수 응용 프로그램과 함께 진행되며 다중 인수 함수를 원래보다 적은 인수를 사용하는 함수로 변환합니다.

재귀 : 자체 내에서 함수를 호출하여 반복합니다. 변경 가능한 데이터에 액세스 할 수없는 경우 재귀를 사용하여 데이터 구성을 구축하고 연결합니다. 이는 주어진 시간에 루프의 상태를 저장하기 위해 변수를 전달해야하므로 루핑은 기능적 개념이 아니기 때문입니다.

지연 평가 또는 지연 평가 : 실제로 필요한 순간까지 값 처리를 지연합니다. 예를 들어 지연 평가가 활성화 된 피보나치 수 목록을 생성하는 코드가있는 경우 결과의 값 중 하나가 puts와 같은 다른 함수에 필요할 때까지 실제로 처리 및 계산되지 않습니다.

제안 (그냥 생각)mode 기능적 패러다임으로 파일을 선언 하는 지시문을 갖는 일종의 정의가 있으면 좋을 것입니다.

모드 '기능'


Ruby는 기능적 프로그래밍 스타일을 지원하는 다중 패러다임 언어입니다.


Ruby는 다른 패러다임 (기능적, 명령 적 등)을 지원할 수있는 객체 지향 언어입니다. 그러나 Ruby의 모든 것은 객체이므로 주로 OO 언어입니다.

예:

"hello".reverse () = "olleh", 모든 문자열은 문자열 객체 인스턴스 등입니다.

여기 또는 여기에서 읽으 십시오


"기능적 언어"의 정의에 따라 다릅니다. 개인적으로이 용어는 절대적으로 사용될 때 그 자체로 상당히 문제가 있다고 생각합니다. 단순한 언어 기능보다는 "기능적 언어"가되는 데 더 많은 측면이 있으며 대부분은 사용자가 찾고있는 위치에 따라 다릅니다. 예를 들어, 언어를 둘러싼 문화는 이와 관련하여 매우 중요합니다. 기능적인 스타일을 장려합니까? 사용 가능한 라이브러리는 어떻습니까? 기능적으로 사용하도록 권장합니까?

예를 들어 대부분의 사람들은 Scheme을 기능적 언어라고 부릅니다. 하지만 Common Lisp는 어떻습니까? 다중 / 단일 네임 스페이스 문제와 보장 된 꼬리 호출 제거 ​​(컴파일러 설정에 따라 일부 CL 구현도 지원)를 제외하고는 Scheme을 Common보다 기능적 프로그래밍에 더 적합한 언어로 만드는 것은 많지 않습니다. Lisp, 그리고 여전히 대부분의 Lispers는 CL을 기능적 언어라고 부르지 않습니다. 왜? 이를 둘러싼 문화는 CL의 명령 적 기능 (예 : 대부분의 Schemer가 아마 눈살을 찌푸리는 LOOP 매크로와 같은)에 크게 의존하기 때문입니다.

On the other hand, a C programmer may well consider CL a functional language. Most code written in any Lisp dialect is certainly much more functional in style than your usual block of C code, after all. Likewise, Scheme is very much an imperative language as compared to Haskell. Therefore, I don't think there can ever be a definite yes/no answer. Whether to call a language functional or not heavily depends on your viewpoint.


Ruby isn't really much of a multi-paradigm language either, I think. Multi-paradigm tends to be used by people wanting to label their favorite language as something which is useful in many different areas.

I'd describe Ruby is an object-oriented scripting language. Yes, functions are first-class objects (sort of), but that doesn't really make it a functional language. IMO, I might add.


Recursion is common in functional programming. Almost any language does support recursion, but recursive algorithms are often ineffective if there is no tail call optimization (TCO).

Functional programming languages are capable of optimizing tail recursion and can execute such code in constant space. Some Ruby implementations do optimize tail recursion, the other don't, but in general Ruby implementations are not required to do TCO. See Does Ruby perform Tail Call Optimization?

So, if you write some Ruby functional style and rely on TCO of some particular implementation, your code may be very ineffective in another Ruby interpreter. I think this is why Ruby is not a functional language (neither is Python).


Strictly speaking, it doesn't make sense to describe a language as "functional"; most languages are capable of functional programming. Even C++ is.

Functional style is more or less a subset of imperative language features, supported with syntactic sugar and some compiler optimizations like immutability and tail-recursion flattening,

The latter arguably is a minor implementation-specific technicality and has nothing to do with the actual language. The x64 C# 4.0 compiler does tail-recursion optimization, whereas the x86 one doesn't for whatever stupid reason.

Syntactic sugar can usually be worked around to some extent or another, especially if the language has a programmable precompiler (i.e. C's #define).

It might be slightly more meaningful to ask, "does language __ support imperative programming?", and the answer, for instance with Lisp, is "no".


Please, have a look at the beginning of the book: "A-Great-Ruby-eBook". It discusses the very specific topic you are asking. You can do different types of programming in Ruby. If you want to program like functionally, you can do it. If you want to program like imperatively, you can do it. It is a definition question how functional Ruby in the end is. Please, see the reply by the user camflan.

참고URL : https://stackoverflow.com/questions/159797/is-ruby-a-functional-language

반응형