11

함수 응용 프로그램이 어떻게 haskell에서 currying으로 작동하는지 이해하는 데 문제가 있습니다. 나는 다음과 같은 기능이있는 경우 :하스켈 달러 연산자 응용 프로그램

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

나는 부분적으로이 기능을 적용에 내가 (a -> b) 기능 ($의 첫 번째 인수)를 제공 할 필요가 있음을 이해합니다.

왜 값을 먼저 적용 할 수 있습니까 (즉, 역 인수)?

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

무엇이 여기에 있습니까?

답변

13

($):: Num a => (a -> b) -> b는 연산자를 가지고있다. 하스켈에서는 모든 연산자 좌측 섹션에 기록 할 수있다 (같은 (x $)) 또는 우측 부 (같은 ($ x))

(x $) = (\y -> x $ y) = ($) x 
($ x) = (\y -> y $ x) = flip ($) x 

주는이 규칙에 대한 유일한 예외는 순서 (-) 것을 편리 음수 작성 : 당신이 간결 (\y -> y - x)를 작성하려는 경우

\x -> (x-) :: Num a => a -> a -> a -- equivalent to \x -> (-) x 
\x -> (-x) :: Num a => a -> a  -- equivalent to \x -> negate x 

을, 당신은 subtract 사용할 수 있습니다

,536,
\x -> subtract x :: Num a => a -> a -> a -- equivalent to \x -> flip (-) x 
+0

감사합니다. 왜 이렇게 작동하는지 설명합니다. 이러한 정의가 언어 기능입니까 아니면 소스의 어딘가에서 찾을 수 있습니까? – Rumca

+2

@Rumca 소스가 아니라 (x $)와 ($ x) 섹션은 섹션이며 그 설명은 [2010 haskell report] (http://www.haskell.org/onlinereport/haskell2010/)에서 찾을 수 있습니다.) [섹션 섹션] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-300003.5). – Davorak

+0

언어는 [Haskell 2010 Report] (http://www.haskell.org/onlinereport/haskell2010/)에 설명되어 있습니다. –

4

($ 0) ≡ 경우 ($) :: (a -> b) -> a -> b)(\x -> x $ 0)(\x -> ($) x 0)

우리가 (\x -> ($) x 0)처럼 두번째 인수를 적용 우리

2

연산자의 중위 표기법을 함수와 혼동하고 있습니다. 여기

> :t (($) (+1)) 
(($) (+1)) :: Num b => b -> b 

더 나은 이해를 위해, $로 표현 어떤 형태이다 :

US $의 B => ($) AB

의 ($ b) => 플립 ($) (B) => (\ BA -> ($) AB) B =>를 \ -> ($) AB

(a $) => ($) A => \ B -> ($) AB

+0

-1이 질문의 내용과 추론이 무엇인지 확실하게 이해하는 사람이라 할지라도 나는이 해답을 이해할 수 없다고 생각합니다. 하스켈을 모르는 사람은 어떻게 이것을 잘 이해할 수 있습니까? 운영자와 기능간에 차이점이 무엇인지에 대한 설명이 없습니다. '$ b => flip ($) b => \ a -> ($) a'는 유효한 문법이 아닙니다. (편집 : 좋아, 만약 내가 조금 더 담당자가 있다면 -1 일 것이다.) –

1

Haskell 구문에서 영숫자 이름은 구두점 이름과 구별된다는 점에 유의하십시오.

영숫자 기능 foo1 a b은 기본적으로 접두사이며, 백틱을 추가하면 중위어가됩니다 (a `foo` b).

$ 또는 <*> 같은 구두점 이름의 기능은 기본적으로 중위이며, 괄호 ($) 또는 (<*>)를 추가하면 접두사가된다. 이것은 라틴 알파벳에 익숙한 프로그래머를위한 구문 설탕이다. 영숫자 이름과 구두점 이름 사이의 임의적이지만 유익한 차이입니다.

두 종류의 함수는 단지 함수이며 C++ 또는 Java의 "연산자"에 대한 특별한 의미 규칙은 없습니다. 접두사/중위 어와 역 따옴표/괄호 주위의 구문 규칙은 문장 부호로 명명 된 함수와 영숫자로 명명 된 함수 사이에서 다릅니다.

관련 문제