2010-06-13 4 views
119

나는 실제 세계 하스켈을 읽었으며 끝이 가까워지고 있지만 스타일에 관한 문제는 내가 (.)($) 연산자.

f = g . h 

을하지만 당신이 그 기능의 끝에 뭔가를 적용 할 때 나는이처럼 쓰기 :

다른 기능의 구성은 함수를 작성할 때 당신은 같은 그것을 쓰기

k = a $ b $ c $ value 

그러나이 책이처럼 작성합니다 : 나에게 지금

k = a . b . c $ value 

을들이는 기능을 보면 동등하게, 그들은 내 눈에서 똑같은 일을한다. 그러나 더 많이 볼수록 더 많은 사람들이 책을 읽는 방식으로 기능을 쓰는 것을 보게됩니다 : (.)으로 작성한 다음 끝에 만 ($)을 사용하여 많은 것을 평가할 값을 추가하십시오 (아무도 많은 달러를 사용하지 않습니다. 조성물).

($) 기호를 사용하는 것보다 책을 사용하는 것이 더 좋은 이유가 있습니까? 아니면 제가 모르는 가장 좋은 방법이 있습니까? 또는 그것은 불필요한 것이고 그것에 대해 전혀 걱정하지 않아도됩니까?

+3

두 번째 예제는'k = a $ b $ c 값 '으로 할 수 있습니다. –

+1

예, 아래에 언급 된 Zifre와 같이,하지만 아무 것도 해를 끼치 지 않고 그대로두고 지금 당신의) 의견이 합리적입니다. 그래도 감사합니다. +1 : –

+2

또 다른 일반적인 접근 방법은'a. b $ c value'는 세 번째 예제와 상당히 비슷하지만 몇자를 저장합니다. –

답변

135

나는 권위에서이 질문에 답할 수 있다고 생각합니다.

모든 ($) 기호를 사용하는 것보다 훨씬 좋은 책 방법을 사용해야하는 이유가 있습니까?

특별한 이유는 없습니다. 브라이언과 나는 둘 다 라인 노이즈를 줄이는 것을 선호한다. .$보다 조용합니다. 결과적으로이 책은 f . g . h $ x 구문을 사용합니다.

+2

음, 이보다 더 나은 대답을 기대할 수는 없습니다. 저자 중 한 명. :) 그리고 그것은 의미가 있습니다, 내가 읽었을 때 페이지에서 훨씬 더 조용 해 보입니다. 이것을 질문에 직접 답하기 때문에 이것을 답으로 표시하십시오. 답변 해 주셔서 감사합니다. 그리고, 사실, 책. –

+33

저자와 의견이 다를 수는 없지만 * 사용하는 것보다는 * 만드는 * 정신적 모델에 또 다른 중요한 이유가 있다고 생각합니다. 하스켈 사용자는 f.g.h를 f (g (h()))라는 새로운 영리한 창조물로 생각하고 싶어한다. 이제는 PHP 사용자처럼 미리 작성된 함수 호출 사전을 체인으로 연결하는 대신 익명으로 작성된 새로운 함수를 호출합니다. –

+1

흥미로운 진술 : '라인 노이즈 감소'와 '보다 조용함'. 나는이 용어로 프로그래밍 언어에 대해 생각해 본 적이 없지만, 완벽하게 이해할 수 있습니다.당신이 빠른 다음 함수 조성물에 종료 할 경우 – Rabarberski

3

이것은 스타일에 관한 문제입니다. 그러나, 책이하는 방식은 나에게 더 이해가된다. 모든 함수를 작성한 다음 값에 적용합니다.

귀하의 방법은 이상하게 보입니다. 마지막 $은 불필요합니다.

그러나 실제로는 문제가되지 않습니다. 하스켈에는 보통 똑같은 일을하는 수 많은 올바른 방법이 있습니다.

+3

나는 마지막 $가 불필요하다는 것을 알지 못했지만해야만했다. 감사합니다. 사람들이이 주석의 의미를 알 수 있도록이 책을 그대로 두겠습니다. –

51

이들은 실제로 동일합니다. $ 연산자는 본질적으로 아무 것도하지 않습니다. f $ xf x으로 평가됩니다. $의 목적은 고정 관념 (rightity and minimum precedence)입니다. 제거 $ 대신 중위 우선 순위의 그룹화 괄호를 사용하여 코드 조각은 다음과 같이 :

k = a (b (c (value))) 

k = (a . b . c) value 
$ 버전 위에 . 버전을 선호하는 이유가 같은 이유입니다

위의 괄호 안의 버전보다 두 가지를 선호합니다 : 심미적 호소.

괄호 대신 중위 연산자를 사용하는 것이 Lisp과 닮았을 가능성을 피하기위한 무의식적 인 충동에 기반을두고 있는지 궁금해 할 수도 있습니다.

18

나는 대답이 (a) 깔끔함이라고 생각한다. Don said; (b) 코드를 편집 할 때 함수가 포인트가없는 스타일로 끝난 다음 마지막으로 $을 삭제하고 모든 것을 변경하는 대신 코드를 삭제하면됩니다. 사소한 부분이지만, 확실히,하지만 좋았습니다.

+0

그래 그, 그런 식으로 쓰기 좋은 이유입니다. :) 저도 키 스트로크를 저장해 주셨습니다.하지만 더 중요한 것은 시간이었습니다. +1 –

13

이 질문에 대한 흥미로운 토론은 this haskell-cafe thread입니다. 분명히 $의 올바른 연관성이 "just plain wrong"이고 f $ g $ h $ x을 초과하는 f . g . h $ x을 선택하는 소수 의견은이 문제를 밟는 하나의 방법입니다.

+0

이봐, 너는 그 문제에 대한 전체적인 토론을 발견했다. 정말 끝내 주는데, 지금 책 읽는 중입니다. 여기 +1 –

+2

유사 인수 : https://ghc.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity – enrique

+0

참고'$ '도 "명백히 잘못"바로 연관성을 가지고 - [왜 $입니다! 연산자 오른쪽 연관?] (http://stackoverflow.com/q/23570501/94687). –

35

f . g $ xf . g은 의미있는 구문 단위입니다.

한편, f $ g $ x에서 f $ g은 의미있는 단위가 아닙니다. $ 체인 틀림 더 긴급하다 - 먼저 다음 그것에 foo을 그것에 f, 다음 xg 결과, 를 얻을 후 한편 등

체인의 .은 아마도 더 선언적이며 데이터 흐름 중심의 뷰에 더 가까운 의미에서 일련의 함수를 구성하고 궁극적으로는 무언가에 적용합니다.

+1

내가 하스켈을 배우고 (의미있는 코딩하지 않은 경우)하지만 난 "파이프"연산자의 일종으로 $ 생각하고 싶다. 그것은 터미널과 매우 흡사하다. 파이프 (오른쪽에서 왼쪽으로 데이터 흐름 제외). 그러나 터미널 프로세스처럼 각 유닛은 명시 적으로 독립적입니다. – LostSalad

+1

'$ '연산자는 F #의'<|'연산자와 비슷하게 동작합니다. 나는 사실, 모두가 동일하게 정의되어 생각 - F 번호에'(<|) A B = A b'와 하스켈,'달러 (A $)의 b는 기본적으로 해당되는 b'. 그것은이 1 '과 같이 사용 이후, F #에서 b' = A B | – Quackmatic

+0

@Quackmatic 막히게 일부는'이다 (<) 2; 삼; 4; 5] <| 메모리가 작동하는 경우 List.map ((+) 1)'. – BalinKingOfMoria

0

저는 이것이 아주 오래된 질문이라는 것을 알고 있습니다. 그러나 언급되지 않은 또 다른 이유가 있다고 생각합니다.

새로운 무 코드 함수 f . g . h을 선언하는 경우 전달한 값이 자동으로 적용됩니다. 그러나 f $ g $ h으로 작성하면 작동하지 않습니다.

필자가 작성 방법을 선호하는 이유는 기능을 구축하는 좋은 습관으로 연결되기 때문이라고 생각합니다.