LISP와 Haskell의 장점은 무엇입니까? 그들은 나를 더 나은 프로그래머로 만들 것인가? [닫은]


40

나는 Lisp와 Haskell이 각각 논리 및 함수형 프로그래밍 언어라는 것을 알고 있지만 이것이 정확히 무엇을 의미합니까? 다른 언어와 어떻게 다릅니 까? 이것들을 배우면 더 나은 프로그래머가되고 논리를 향상시킬 수 있다고 들었습니다. 이것이 사실입니까? Lisp 또는 Haskell을 유능한 수준으로 배우면 프로그래밍이 향상되고 어떤 언어로든 문제를 처리하는 데 더 좋을까요? 나는 그들이 학습 노력의 가치가 있는지 알고 싶었습니다. 또한 이러한 언어는 GUI 및 그래픽과 같은 영역에서 유용합니까 아니면 콘솔 응용 프로그램에만 유용합니까?


35
LISP와 Haskell을 사용하면 더 나은 LISP와 Haskell 프로그래머가 될 것입니다.

17
@MasonWheeler 말해야한다; Haskell의 유형 시스템에는 다른 언어로는 찾을 수 없으며 LISP 매크로는 주류 언어에는 없습니다. 그들이 있기 때문에 이러한 것들을 모두 가치가 학습이다 않는 당신의 작업 언어로 당신에게 더 나은 프로그래머을합니다. 적어도 이것은 나의 경험이었다. Haskell은 나를 더 나은 엔터프라이즈 C # 개발자로 만들었습니다. 나는 결코 그렇게하지 않았을 염려를 명확하게 분리하는 기술을 알고 있으며, 문제를 파싱하는 것은 Haskell을 배우기 전보다 훨씬 간단 할 것입니다.
Jimmy Hoffa

6
Erlang은 기능적인 언어입니다. Rabbit MQ는 Erlang으로 작성되었으며 Rabbit은 많은 미션 크리티컬 무거운 리프팅을 수행하기 위해 많은 곳에서 사용됩니다. 함수형 언어는 프로그래밍에 대해 다르게 생각하도록 가르치며, 이는 사용자가 자유롭게 사용할 수있는 훌륭한 도구입니다. 이러한 개념 중 일부가 더 널리 사용되는 언어 (예 : C # 및 C ++의 람다 식)로 만들어졌지만 기능적 언어를 사용할 때 여전히 다른 방식으로 문제 해결에 접근합니다.
이진 걱정

8
@MasonWheeler 언어가 다른 언어보다 더 유용 할 수 있지만, 아직 널리 사용되지 않는 이유는 완벽합니다. 기존 사용자 기반, 너무 급진적 인 변화, "좋은 것이 충분할 때", 그리고 더 나은 툴이 더 공식적으로 훈련 된 프로그래머를 필요로 할 때 많은 것을 생각할 수 있습니다. 따라서 인기유용성의 척도가 아닙니다 .
Andres F.

5
@MasonWheeler 비유를 사용하기 위해 수학은 실생활에서 매우 유용한 분야입니다. 그렇다면 왜 더 많은 사람들이 수학에 능숙하지 않습니까? 왜 많은 사람들이 그것을 두려워하고, 그것이 흑 마법이라고 생각하고 실제로 그렇게 유용한 것은 아니라고 생각합니까?
Andres F.

답변:


37

수학을 배우면 분석 기술이 향상되고 라틴 / 고전 문학을 배우면 작문 기술이 향상되는 것과 매우 흡사합니다.

이러한 언어를 디자인 한 사람들은 프로그램 작성의 의미에 대해 열심히 생각했습니다. 그리고 그 언어는 그 연구의 결과입니다.

즉, Java를 배우면 더 나은 프로그래머가 될 것입니다. 그리고 학습 C. 진정한 이점은 다른 철학을 가진 언어를 배우는 것에서 비롯됩니다. 그러면 프로그램 작성 방법에 대한 자신의 의견을 가질 수 있습니다.

편집하다

나는이 답변이 아직 haskell 및 / 또는 lisp를 배우지 않은 사람들에게는 그렇게 유용하지 않다는 것을 알고 있습니다. 여기에 내가 의미하는 바를 더 설명하기위한 몇 가지 예가 있습니다.

리스프

Lisp는 구문이 최소화되어야하고 모든 것이 목록 또는 기본이어야한다고 생각합니다 (Lisp는 목록 처리를 나타냄). 프로그램조차도 주로 다른 목록과 기호를 포함하는 목록입니다. Lisp을 사용하면 프로그램을 목록으로 조작하고 새 프로그램을 즉석에서 생성 할 수 있습니다. 따라서 전체 code is data and data is code모토.

Lisp 언어를 사용하면 원하는 인터페이스를 정의 할 수 있습니다. 좋은 예는 클로저 웹 프레임 워크 인 compojure입니다. 라우팅 기능은 다음과 같습니다.

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

또 다른 좋은 예는 딸꾹질 템플릿 프레임 워크입니다.

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

보시다시피 결과는 콧수염과 같은 DSL에서와 같이 간결하지만과 같은 언어 기능을 사용할 수 있습니다 (for [x (range 1 4)] block). 더 좋은 점은 코드를 추상화하고 구조화하는 모든 도구가 있다는 것입니다.

다른 언어에서는 구문이 더 복잡합니다. Java 프로그램을 여러 목록으로 읽을 수 없습니다. 그러나 Lisp를 사용하면 이상적인 인터페이스의 모양과 코드에서 데이터로 추상화 할 수있는 것에 대해 더 잘 알 수 있습니다. 또한 좋아하는 언어를 큰 데이터 구조로보고 의미를 더 잘 이해하는 데 도움이됩니다.

하스켈

하스켈은 강력한 정적 타이핑과 순도를 믿습니다. 순수한 함수는 수학 함수와 같습니다. 값 세트에 정의되어 다른 세트에 맵핑됩니다. 함수에는 부작용이 없으며 값은 변경할 수 없습니다. 순도는 다중 패러다임 언어가 가질 수있는 것이 아니기 때문에 흥미 롭습니다. 언어는 순수하다.

한 가지 결과는 원할 때마다 IO 작업을 수행 할 수 없다는 것입니다 (하스 켈러는 이것이 좋은 것이라고 생각합니다). IO 동작은 트랜잭션으로 정의되며 이는 순수한 값입니다. mainhaskell 프로그램 의 값은 프로그램을 실행할 때 실행되는 IO 트랜잭션입니다.

프로그램의 데이터 흐름을 명시 적으로 처리해야합니다. 글로 z 변수에서 자료를 읽고 읽음으로써 두 구성 요소가 통신하도록 할 수 없습니다. 값을 작성하고 전달해야합니다.

Jimmy Hoffa가 언급 한 또 다른 기능은 리치 유형 시스템입니다. 다른 언어에는 정적 입력이 있지만 haskell에서는 다음과 같은 것을 가질 수 있습니다.

length :: [a] -> Int (의 목록에서 정수로의 기능)

map :: (a -> b) -> [a] -> [b]( a to b변환과 a의 목록 을 가져 와서 b의 목록을 반환하는 함수)

좋은 점은 그 기능이 실제로 무엇을하는지 설명 할 필요가 없다는 것입니다. 당신은 이미 그들의 행동을 이해하고 있습니다. 또한 이러한 시그니처가있는 함수는 실제로는 목록의 길이를 계산하고 목록에 대한 변환을 매핑 할 수 있습니다.

다른 유형의 언어에서 클래스 계층 구조는 변경 가능성과 결합하여 이러한 유형을 다루는 악몽을 만듭니다. 당신은 언어의 관점 (즉, 간단하고 강력하며 안전한)에서 바로 얻을 수없는 공분산과 반공 분산을 이해해야합니다.

안전한 경로 (스칼라와 같은)를 가져 와서 실제로 복잡한 언어로 끝나거나 간단한 경로를 사용하여 제한된 (Google은 일반 목록 및지도로 제한) 또는 안전하지 않은 (항상 다트 제네릭) 공변량).

haskell을 사용하면 주로 순수성의 이점과 순수 코드 작성 방법에 대해 배웁니다.


1
@JimmyHoffa 사람들이 간과하는 경향이 있기 때문에 실제로 자체 답변이 필요하다고 생각합니다. 사람들이 자신의 안락 지대 밖에서 최소한 그 영역에 손을 댈 때까지 존재하지 않는 기능 프로그래밍으로 가장 잘 해결되는 문제 영역이 있습니다.
KChaloux

2
나는 의회에 대해 모른다. 그리고 나는 그것을 언급하지 않았다. 그러나 어셈블리는 프로그램 실행 방법을 이해하는 데 도움이됩니다. 성능 문제를 설명하기 위해 생성 된 어셈블리를 분석 할 수있는 사람들에 대한 SO에 대한 훌륭한 게시물이 있습니다.
Simon Bergot

3
@ KChaloux 나는 대답을 쓸 것이지만이 질문은 종결되어야합니다 (그에 따라 투표를 마칩니다). 간단히 말해서 답변에 내 의견과 경험을 쓸 수는 있지만 다른 답변보다 옳거나 잘못되지는 않습니다. 문제는 언어 추천 질문이며 마감하기로 한 이유입니다.
Jimmy Hoffa

7
OMG, @Neil은 컴퓨터가 실제로 가장 잘하는 일을 알고 있으면 더 나은 프로그래머가 될 것입니다. 몇 년 동안 어셈블리를 작성하지는 않았지만 정기적으로 (다양한 플랫폼에서) 읽었으며 프로그램이 실제로 어떻게 작동하는지에 관심이 있다면 최소한 기본 사항을 아는 것이 중요합니다.
dash-tom-bang

3
@Neil, 어떤 경우에 프로그래머에게 더 나쁜 혜택이 있습니까? 스파게티 코드를 만드는 이유는 무엇입니까? 스파게티 코드는 어셈블리를 알지 못하고 그것을 배우지 않기 위해 합리화가 필요한 판타지 랜드를 제외하고 어셈블리 또는 훌륭한 프로그래머와 어떤 관련이 있습니까? 어떤 경우되고 좋은 것은 조립 코더 일하게 높은 인식 나쁜 코딩 관행을.
dash-tom-bang

12

tl; dr 새로운 것들을 배우는 것은 더 나은 프로그래머 될 수 있지만 더 좋은 프로그래머 가되는 것은 코드를 작성할 수있는 언어에 관한 것이 아닙니다.

LISP와 Haskell의 장점은 무엇입니까?

LISP :

  1. 동종 코드. 이를 통해 구조화 된 자체 수정 코드가 가능합니다.
  2. 구문 인식 매크로. 상용구 코드를 다시 작성할 수 있습니다.
  3. 프래그머티즘. CL은 작업 전문가가 작업을 수행하도록 설계되었습니다. 대부분의 기능적 언어는 일반적으로 그렇지 않습니다.
  4. 적응성. 합리적인 속도로 많은 다른 일을 할 수 있습니다.
  5. 경고. 현실은 지저분합니다. 실용적인 코딩은 지저분한 구성을 사용하거나 발명해야합니다. 커먼 리스프는 작업을 수행 할 수있는 충분한 주의력을 가지고 있습니다.

CL에 대해 선택해야 할 유일한 이유는 표준 라이브러리에 날짜가 있다는 것입니다.

나는 사지로 나가서 일반적인 경우에 구문은 전문 소프트웨어 작업자에게 문제가되지 않아야한다고 말합니다.

From : Lisp가 유용한 이유는 무엇입니까?

하스켈 :

Haskell은 컴퓨터 프로그래밍 언어입니다. 특히,이 언어는 다형성으로 정적으로 유형이 지정되고 게으른 순수 기능 언어이며 다른 프로그래밍 언어와는 상당히 다릅니다. 이 언어의 이름은 Haskell Brooks Curry의 수학적 논리 작업이 기능적 언어의 기초 역할을합니다. Haskell은 람다 미적분학을 기반으로하므로 로고로 사용하는 람다입니다.

기능적 대 명령에 대한 설명을 읽을 수 있습니다.

보낸 사람 : http://www.haskell.org/haskellwiki/Introduction

그들은 나를 더 나은 프로그래머로 만들 것인가?

물론 더 많은 언어와 패러다임을 알고 있으면 더 나은 프로그래머가 될 수있을뿐 아니라 다음과 같은 이점이 있습니다.

더 나은 프로그래머를 만들 수있는 단일 도구, 단일 책, 단일 프로그래밍 패러다임이 없습니다.

다른 패러다임으로 다른 프로그래밍 언어를 배우면 확실히 더 나은 프로그래머가되고 다른 문제로 인한 문제를 해결하는 법을 배우면 논리적 사고에 큰 도움이됩니다.

좋은 프로그래머가되는 것은 언어에 관한 것이 아니라 어떤 언어로든 문제를 해결할 수있는 능력에 관한 것입니다. 그리고 당신이 언어를 모른다면, 그 언어를 빨리 배우고 효과적으로 사용하는 능력.

나는 당신의 생각이 더 글로벌할수록 더 나은 개발자라고 생각합니다.

예를 들어, 코드에 유용한 주석을 추가하고 코드의 가독성, 유지 관리 성을 관리 할 수 ​​있습니다. 작은 세부 사항에주의하십시오. 입력하기 전에 생각하십시오!. desing 패턴에 대해 알아보십시오. 모범 사례를 따르십시오.

공개 : 이것은 내 블로그 에서 것이기 때문에 최악의 광고입니다 .


4
LISP 또는 Haskell을 유능한 수준으로 배웠습니까?
Jimmy Hoffa

10
어느 언어도 거의 아는 사람으로부터이 말을 듣는 것은 조금 혼란 스럽습니다. 당신은 그들이 지금 당신이 필요로하는 도구가 아니라고 주장하지만 그들이 무엇을위한 도구인지 모릅니다. 어떻게 알 수 있습니까? 또한 LISP는 관계형 데이터 분석에만 유용한 SQL 파생물이며 Haskell은 Regexp의 엄격한 하위 집합 일 수 있다는 것을 알고있는 한, 누군가에게 배우거나 배우지 않을 것을 조언 할 수있는 방법을 알려줄 수 있습니다.
Jimmy Hoffa

10
이것은 실제로 질문에 대답하지 않습니다. 당신은 당신이 모르는 두 가지 언어에 관한 질문에 대해 모호한 일반적인 대답을하는 놀라운 업적에 성공했습니다 : /
Andres F.

2
이 막연하게 주위 춤 때문에 -1 무엇인지 정확히 커먼 리스프와 하스켈 당신을 가르칩니다. 예 : 코드, 코드, 순도, 참조 투명성, 모나 딕 추상화, 함수형 프로그래밍, 언어 지향 프로그래밍, 타입 지향 프로그래밍 등의 데이터 데이터
jozefg

3
또한 어느 언어를 모른다면 나는 당신이 그 질문에 대답 할 수 있다고 생각하지 않습니다 : / 죄송합니다
jozefg

9

일반적으로 운영하는 패러다임 외부의 언어를 배우면 일상적인 대안 솔루션에 마음이 열리고 선택한 언어의 일부 기능을 더 잘 이해하는 데 도움이 될 수 있습니다. 그러한 언어를 아는 것만으로도 그 언어에서 배운 교훈을 받아 매일 보는 상황에 적용 할 수 없다면 더 좋은 프로그래머가 될 수 없습니다.

그것은 언어에 국한되지 않습니다. 이전에 보지 않았거나 사용하지 않은 다양한 데이터 구조를 읽으면 다음에 문제가 발생할 때 하나의 가능한 해결책이 있으므로 지식 범위를 넓히는 데 도움이 될 수 있습니다.

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