2016-07-23 4 views
0

나는 haskell에서 ($)에 대해 매우 혼란 스럽다.

내가 ghci에서

:t ($) 

를 입력 할 때. 나는

:t ($ 3) 

내가

($ 3) :: Num a => (a -> b) -> b 

그럼, 왜 ($) 오류없이 두 번째 인수를 허용 얻을 것이다 입력 할 때,

:($) :: (a -> b) -> a -> b 

를 얻을 수 있지만 것인가?

+1

'($)'함수는 실제로는 하스켈의 일반적인 함수이지만 중절 연산자이기도합니다. 이름이 완전히 상징적 인 모든 함수와 마찬가지입니다. 중위어 연산자는 * 연산자 섹션 *이라고하는 특별한 부분 응용 프로그램 구문을 가지고 있으며 여기에 대한 자세한 내용은 https://wiki.haskell.org/Section_of_an_infix_operator –

+0

@Alexis King, [너무 일반적이지 않습니다.] (http : // www. mail-archive.com/[email protected]/msg18923.html). – user3237465

+1

@ user3237465 저는 실제로 그것을 잘 알고 있습니다. 그렇지만 그것을 학습자에게 가져 오는 것은 완전히 불필요한 혼란을 일으킬 것입니다. –

답변

8

($)은 삽입 연산자 함수 인 연산자입니다. 그것은 정의는 매우 간단입니다 (이 재미있는 유일한 것은 그 정착입니다 사실, 나는 구글이 그에 자원의 톤이있다 확신) : 모든 사업자처럼

($) :: (a -> b) -> a -> b 
f $ x = f x 

을, 당신은 sections 걸릴 수 있습니다 첫 번째 또는 두 번째 인수 만 적용하면됩니다. 이것은 또한 (+) 연산자 더 분명 수 있습니다 :

(+ 2) -- equivalent to \x -> x + 2 
(2 +) -- equivalent to \x -> 2 + x 

동일 ($ 3)에 대한 보유 - 그것은 \f -> f $ 3에 해당합니다. 이 함수의 타입은 다음과 같이 명확해야합니다. 인수 f은 숫자를 취하여 다른 것을 반환하는 함수 여야하며 (f :: Num a => a -> b) 전체 함수는 f이 반환하는 것과 동일한 유형을 반환합니다. 즉

(\f -> f $ 3) :: Num a => (a -> b) -> b 

그리고 결과적으로 ($ 3) :: Num a => (a -> b) -> b 제공합니다.

+0

(3 $) 그렇다면 어떻게 될까요? 나는 그것이 어떤 결과도 가져 오지 않을 것이라고 생각한다. map (3 $) [\ x-> x + 10]에서 사용 하시겠습니까? – MD05

+1

'(3 $)'는 타입 검사를하지 않습니다. '$'는 첫 번째 인수가 함수가 될 것으로 기대합니다. – Alec