루비를 하스켈처럼 작성하기로 결정해도 괜찮습니까?


10

루비는 내장,리스트, 선택, 수집 등 좋은 목록 조작 기능을 가지고 있다고 가정합니다. Procs, Blocks 및 Lambdas를 가지고 있으며 반복 지원 ( each패밀리) 이 뛰어납니다. 가능한 가장 순수한 기능으로 모든 루비를 작성합니까? I / O가 거의 없거나 전혀없는 코드 (종종 덜 명백한 부작용)에 대해 간혹?

나는 Haskell ( '실제'해커의 언어라고 함)을 배우고 있으며, 일을하는 방식과 사랑에 빠져 있습니다. 루비를 좋아하지만 더 많은 Haskell 정신이 그것에 들어갔을 때 더 재미있을 수 있다고 생각합니다 (잘,하지 않았습니다) 루비는 처음부터 빌리지 / 많은 것을 배우지 않습니까?)

건설적인지도는 환영합니다 ...


13
그렇다면 왜 하스켈로 글을 쓰지 않겠습니까?

1
나는 Haskell로만 글을 쓸 것이지만 Ruby는 완전히 버려 질 자격이 없습니다. 스크립팅 할 때 사용할 수 있다는 사실과 AI 실험을 배울 때 많은 빠른 실험을 위해 함께 해킹하는 것을 좋아합니다. 난 그냥 하스켈을 배우기 시작했기 때문에하지만, 아마도 당신에게 결국 조언 :-) 따라 수
nemesisfixx

2
왜 Stack Overflow의 권한을 요청하는지 이해가 가지 않습니다. 팀에서 다른 사람들과 공유 할 코드를 작성하는 경우 어쨌든 코딩 스타일을 조정해야합니다. 그렇지 않으면 무엇이 중요합니까?
Mike Daniels

왜 그렇게 물어? 숙련 된 해커와 프로그래머의 솔직한 의견을 존중하기 때문입니다. 경험이 많은 사람들이 나와 같은 다른 사람들과 공유 할 수있는 프로그래밍에 순수 기능적인 접근 방식을 사용하면 이점이있을 수 있습니다.
nemesisfixx

"아니오"에 대한 객관적인 이유가 있다는 것을 고려할 때, 이것은 합법적 인 질문입니다.
Andrew Grimm

답변:


16

나는 파이썬으로 이것을하고있다. 나는 그것을 위해 설계되지 않은 언어로 유 전적으로 순수한 기능적 스타일 로 작성하는 것이 번거 롭다는 것을 알았 습니다. 예를 들어 in_order 의 두 정의를 대조하십시오 .

def in_order(xs):
    for i in range(1,len(xs)):
        if xs[i] > xs[i+1]:
            return False
    return True

inOrder :: (Ord a) => [a] -> Bool
inOrder xs = and $ zipWith (<=) xs (tail xs)

in_order파이썬에서 Haskell 방식을 작성 하는 것은 장황 할 것입니다 (파이썬은 필요한 관용구를 잘 지원하지 않기 때문에).

그러나, 나는 기능적 조직 과 각 기능의 관용적 구현으로 파이썬 프로그램을 성공적으로 만들었습니다 . 이것이 프로그래밍하는 좋은 방법이라는 아이디어는 실제로 내 코드 카탈로그 프로젝트 의 논문 입니다. 따라서 내 구성 요소는 상태가있는 클래스가 아닌 추상화 및 함수 (순수한 인터페이스 사용 )를 중심으로 구성되어 있으며 잘 어울립니다. 실제로 이런 방식으로 구성된 코드는 클래스로 구성된 코드보다 재사용이 더 유연 해 보입니다. 그러나 저는 여전히 하스켈 신봉자이기 때문에 개인적인 편견이 될 수 있습니다.

따라서 귀하의 질문에 대한 답변은 다소 그렇습니다 . 생각하는 데 도움이되는 기능적인 뿌리를 사용하십시오. 예 : 관용구를 위해 루비에서 게으른 목록을 시뮬레이션하는 것은 아마도 가치보다 더 많은 문제가 될 것입니다.


어떻게 든 당신의 설명은 파스칼을 생각하게 만들었습니다.
rasjani

@rasjani, 오? 이유가 무엇입니까?

나는 영어를 잘 이해하지 못했거나 파스칼 단위로 배열 / 구조하는 것들이 어떻게 (적어도) 적합한 지 알지 못합니다. 단지 일종의 정신적 연결, 첫 번째 옵션으로 인해 실제 연결이 없을 수도 있습니다.)
rasjani

1
"게으름으로 인한 하스켈의 일정한 공간 대신 ​​선형 공간"이라는 문장은 정확하지 않습니다. 게으름은 여전히 ​​선형 순서를 의미합니다. 그러나 나는 당신의 요점을 이해합니다.

3
@aromero, 나는 당신을 이해하지 못합니다. 주문과 관련이 있습니까? 일정한 공간은 Haskell 가비지에서 비롯된 후 비교 목록의 헤드를 수집 and합니다. 루프처럼 동작합니다. 반면 파이썬의 비교 목록은 아날로그가 아날로그를보기 전에 전체적으로 생성되어야 and합니다 (제너레이터를 사용하지 않는 한 가능성이 있습니다).

7

마치 Haskell이 아닌 Scheme 인 것처럼 기능적인 스타일로 Ruby 코드를 작성할 수 있습니다. 마치 하스켈처럼 쓰려면 하스켈 유사 시스템과 퍼베이시브 게으른 평가가 필요합니다.


1

나는 루비에서 만난 특정 상황에서 함수형 프로그래밍과 특히 Haskell을 이해하는 것을 알게되었습니다. 그러나 내가 Haskell을 더 많이 배울수록 Ruby가 Haskell과 전혀 다를 수 없다는 사실을 더 많이 알 수 있습니다.

모듈 / 코드 로딩 상황은 한 가지 까다로운 일입니다. 현재 인터프리터에는 테일 콜 최적화가 설정되어 있지 않으므로 Haskell에서와 같이 재귀를 사용할 수 없습니다. 일단 Monads에 들어가면 Haskell과 Ruby에서 추상화 수준을 비교할 수 없습니다.

관심이 있으시다면 gist.github.com 에 Ruby / Haskell 비교 코드를 게시 했습니다.

내가 최선을 다한 Ruby로 가져 왔던 기술은 내가 할 수있는 곳에서 순수한 기능을 찾는 것이 었습니다.


내 스몰 토크 테스트 중 하나에서 : self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g]). 모나드를 의식적으로 사용할 수없는 이유는 전혀 없습니다 . 목록과 같이 모나드를 사용하고 있다는 사실조차 모나드를 사용하는 것과는 반대입니다.
Frank Shearar

0

나는 "예"라고 말할 것입니다. 당신이 말하는 것은 루비 언어 의 함수형 프로그래밍 영향입니다. 기능적 패러다임에는 객체 지향 (특히 부작용 없음)을 보완하거나 겹치는 멋진 개념이 있습니다.

루비의 가장 큰 장점은 선형, 객체 지향 또는 기능적 스타일 또는 이들을 혼합하여 코딩 할 수 있다는 것입니다. 복잡성이 증가하는 경우 단순 선형 스크립트가 OO / 기능 스타일로 변형 될 수 있습니다.


0

그것은 당신이 다른 사람들과 협력 할 것인지에 달려 있습니다. 코드를 직접 작성하는 경우 가장 편한 스타일을 사용하십시오. 그러나 다른 Ruby 프로그래머와 함께 작업하는 경우 순전히 기능적인 스타일의 프로그래밍에 익숙하지 않을 수 있으므로 코드와 혼동 될 수 있습니다. 그런 다음 공동 작업자가 Ruby로 마이그레이션 한 Haskell 프로그래머이기도 한 경우이 문제점이 없을 수 있습니다.

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