Ruby는 기능적 언어입니까?


88

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


4
아마도 귀하의 질문이 매우 짧기 때문일 것입니다. 개인적으로는 전혀 문제가 없습니다!
ljs

이미 좋은 답변이 있으므로이를 보완하기 위해 FP와 Ruby를 논의하는 한 쌍의 콘텐츠 : code.google.com/p/tokland/wiki/RubyFunctionalProgramming slideshare.net/tokland/functional-programming-with-ruby-9975242
tokland 2012-07-04

1
누구든지이 주제에 관심이 있다면 이것을 시청하십시오. 루비가 어떻게 기능적으로 사용될 수 있는지, 기능적 프로그래밍의 뿌리가 무엇인지, 루비가 기능적 프로그래밍이 가능하더라도 왜 기능적 언어가 아닌지 배우게 될 것입니다 : youtube .com / watch? v = 5ZjwEPupybw
maddin2code

답변:


29

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

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

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

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


4
이 기준을 사용하면 스몰 토크가 블록이 있기 때문에 작동한다고 말할 수 있습니까?
OscarRyz

좋은 대답이지만 한 가지 요점-고차 함수 기능적 스타일에 엄격하게 필요한 것은 아닙니다 . 예를 들어 함수 객체를 정의하고이를 구성하여 상위 함수와 동일한 효과를 얻음으로써 Java (1 급 / 고차 함수가 없음)에서 함수 스타일을 얻을 수 있습니다.
mikera

2
그냥, @peter가 물었다 Is ruby a functional language?고 말하고 싶고 솔직한 대답은 단순한 아니오입니다. Ruby는 몇 가지 기능적 특징을 가진 객체 지향 언어입니다.
Elias Perez

58

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

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

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


3
여러분이 제공 한 슬라이드에는 Ruby가 "FP의 논문을 달성하는 데 매우 부실한" 이유 가 언급되지 않았습니다 . C #이 Java보다 더 좋은 이유는 무엇입니까 (좋아, 더 쉬운 익명 함수?)? Ruby에서 전역 변수를 가질 수 있기 때문입니까?
kizzx2

7
이것은 매우 광범위한 주제이기 때문에 슬라이드는이 세부 사항으로 들어 가지 않습니다. 예를 들어 지나치게 단순화 될 위험이있는 Ruby는 프로그램의 비구 성성을 보장하는 평가 모델 (값별 호출)을 시행합니다. 이것의 의미는 쉽게 과소 평가 될 수 있습니다. Ruby는 또한 프로그램이 일련의 효과라는 생각과 결합되었습니다. 즉, Ruby는 다른 계산 모델을 사용하기 어렵거나 다루기 어렵게 만듭니다. 이 짧은 댓글이 도움이되기를 바랍니다.
토니 모리스

2
언어를 기능적으로 분류하는 모호함을 지적하는 +1. 지옥, 나는 기능적 C를 작성했다!
Eli

1
왜 C #이 Ruby보다 더 좋은가요?
dan_l 2013

1
설명의 중요한 부분 (사실 전체 설명)을 외부 링크로 아웃소싱하므로 효과적으로 링크 전용 답변입니다. 이제 링크가 끊어 졌으므로 대답은 쓸모 없게되었습니다.
ivan_pozdeev

34

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

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

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


3
귀하의 대부분의 진술에 동의합니다. 그러나 "기능 언어에는 Java 등에서와 같은 변수 개념이 없습니다."에 동의하지 않습니다. 하스켈에서는 순수 함수에서 변수를 사용할 수 있고, 변수에 함수를 할당 할 수도 있습니다. 가장 큰 차이점은 변수가 할당되면 나중에 수정할 수 없다는 것입니다.
HHC

6
정의에 따라 HHC 변수는 변경할 수있는 값입니다 . 당신이 말하는 것은 가치입니다.
Scala Newb 2014-06-06

실제로 Haskell의 "수정 불가능한 변수"는 매개 변수 (정의)가없는 상수 함수입니다.
raindev

16

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

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

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

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

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

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

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

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

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


Java보다 Ruby 기능을 호출하는 데 훨씬 더 나은 사례를 만들 수 있다고 생각합니다 .... 아니요, Ruby는 엄격하게 기능하지는 않지만 기능적 스타일을 사용하는 것은 매우 쉽습니다 ... 그리고 비 기능적 스타일 동료는 쉽게 작동하지 않는 상태로 다시 변경
Mike Stone

1
예, Mike, 기능적 스타일로 코딩하려면 Ruby가 Java보다 크게 향상되었습니다. 나는 자바를 사용하여 요점을 과장하고 망치고 있었다.
Chris Vest

그래서 D는 순수한 함수를 가지고 있기 때문에 D를 기능적 언어라고 부를까요? digitalmars.com/d/2.0/function.html#pure-functions
Peter Burns

3
많은 사람들이 Lisp 및 Scheme 기능 언어를 고려합니다. 이는 주로 익명 함수가 널리 사용되기 때문입니다. 그러나 그들은 보장 된 순수 기능이 부족합니다. 순수한 기능을 지원하는 언어로 용어를 제한하는 것은 너무 제한적인 것 같습니다.
skymt

13

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

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

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

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

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

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

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

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

모드 '기능'


2
아니에요. 함수형 언어에 대해 읽어 보도록 여러분을 초대하고 싶습니다. Lisp는 모든 기능적 언어, ML (CAML) 및 Erlang / Elixir의 조부모입니다. 그것은 정말로 사물에 대한 당신의 관점을 변화시킵니다. 나는 전문가는 아니지만 컴퓨터 과학의 끊임없는 학생은 새로운 것을 읽고 배우는 것을 즐깁니다.
Elias Perez

잘 조직 된 대답. 루비가 이러한 것들을 얼마나 잘 지원하는지에 대한 추가 탐구를 좋아했을 것입니다. 고차 함수, 커링 및 재귀가 모두 루비에서 지원 / 가능하다고 생각합니다. 제가 틀렸다면 수정 해주세요.
Michael Dorst


4

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

예:

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

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


나는 "모든 것이 객체이다"가 루비를 더 OO로 만드는 방법을 이해하지 못했습니다. 나는 Ruby가 기본적으로 OO라는 것에 동의하지만, "모든 것이 객체 다"라는 것은 실제로 "primitive"유형이 없다는 것을 의미합니다. 이는 OO 스타일로 프로그램을 작성하는 개발자의 능력에 거의 영향을 미치지 않습니다. 유형은 일반적으로 메소드가없는 4 개 또는 5 개의 유형이 있음을 의미합니다.
Michael Dorst

4

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

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

반면에 C 프로그래머는 CL을 기능적 언어로 간주 할 수 있습니다. Lisp 방언으로 작성된 대부분의 코드는 결국 일반적인 C 코드 블록보다 스타일면에서 훨씬 더 기능적입니다. 마찬가지로 Scheme은 Haskell과 비교할 때 매우 필수적인 언어입니다. 그러므로 나는 확실한 예 / 아니오 대답이있을 수 없다고 생각합니다. 언어를 기능적으로 호출할지 여부는 관점에 따라 다릅니다.


Haskell이 순전히 기능적인 언어가 아닌 이유는 무엇입니까? 아니면 미란다 (잘 알려지지 않은 함수형 프로그래밍 언어)는 어떻습니까? course.cs.washington.edu/courses/cse505/99au/functional/… "Haskell은 표준 순수 기능적 언어입니다."
barlop

2

루비는 실제로 다중 패러다임 언어가 아니라고 생각합니다. 다중 패러다임은 자신이 좋아하는 언어를 여러 분야에서 유용한 것으로 분류하려는 사람들이 사용하는 경향이 있습니다.

Ruby가 객체 지향 스크립팅 언어라고 설명하겠습니다. 예, 함수는 일류 객체 (일종)이지만 실제로 함수형 언어가되는 것은 아닙니다. IMO, 추가 할 수 있습니다.


4
언어 유형은 지원하는 프로그래밍 스타일에 의해 정의됩니다. 그것은 차례로 그것이 가지고있는 기능에 의해 결정됩니다. 일류 및 익명 함수 = 최소한의 함수 프로그래밍. Ruby는 OO 프로그래밍을 지원하지만 필요하지 않습니다. 클래스를 정의 할 필요가 없습니다. 따라서 다중 패러다임.
skymt

2

재귀는 함수형 프로그래밍에서 일반적입니다. 거의 모든 언어가 재귀를 지원하지만 TCO ( 꼬리 호출 최적화) 가없는 경우 재귀 알고리즘은 종종 비효율적 입니다.

함수형 프로그래밍 언어는 꼬리 재귀를 최적화 할 수 있으며 일정한 공간에서 이러한 코드를 실행할 수 있습니다. 일부 Ruby 구현은 꼬리 재귀를 최적화하고 다른 구현은 최적화하지 않지만 일반적으로 Ruby 구현은 TCO를 수행 할 필요가 없습니다. Ruby가 Tail Call 최적화를 수행합니까?를 참조하십시오 .

따라서 일부 Ruby 기능 스타일을 작성하고 특정 구현의 TCO에 의존하면 다른 Ruby 인터프리터에서 코드가 매우 비효율적 일 수 있습니다. 이것이 Ruby가 기능적 언어가 아닌 이유라고 생각합니다 (Python도 아닙니다).


TCO는 본질적으로 프로그램의 동작을 변경하기 때문에 흥미 롭습니다. 어떤 경우에는 이것은 프로그램에 표시되지 않지만 다른 경우에는 예외 역 추적 등입니다. 따라서 항상 적절한 최적화는 아닙니다.
ioquatix 2014 년

2

엄밀히 말해서, 언어를 "기능적"이라고 설명하는 것은 이치에 맞지 않습니다. 대부분의 언어는 함수형 프로그래밍이 가능합니다. C ++도 있습니다.

기능적 스타일은 구문 적 설탕과 불변성 및 꼬리 재귀 평면화와 같은 일부 컴파일러 최적화로 지원되는 명령형 언어 기능의 하위 집합입니다.

후자는 분명 사소한 구현 특정 기술이며 실제 언어와 관련이 없습니다. x64 C # 4.0 컴파일러는 꼬리 재귀 최적화를 수행하는 반면 x86 컴파일러는 어리석은 이유로하지 않습니다.

특히 언어에 프로그래밍 가능한 사전 컴파일러 (예 : C의 #define)가있는 경우 구문 설탕은 일반적으로 어느 정도 또는 다른 범위에서 작업 할 수 있습니다.

"언어 __는 명령형 프로그래밍을 지원합니까?"라고 묻는 것이 약간 더 의미가있을 수 있으며, 예를 들어 Lisp의 경우 대답은 "아니오"입니다.


1

책의 시작 부분을보십시오 : "A-Great-Ruby-eBook" . 그것은 당신이 묻는 매우 구체적인 주제에 대해 논의합니다. Ruby에서 다양한 유형의 프로그래밍을 할 수 있습니다. 기능적으로 프로그래밍하고 싶다면 할 수 있습니다. 명령 적으로 프로그래밍하려면 그렇게 할 수 있습니다. 결국 루비가 어떻게 기능하는지 정의 질문입니다. 사용자 camflan의 답변을 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.