1

나는이 기능이 어떻게 작동하는지에 관한 호기심에서 일종의 최적화로 인한 중간 매개 표현이라고 알고 싶습니다. $는 사실 하나의 인수로만 제공되는 함수라는 것을 이해합니다. 어떻게 든,이 함수를 'map'이 제공하는 목록의 함수에 적용하면 '$'함수가 정확하게 'map'에 의해 제공되는 함수가 부족하다는 것을 알 수 있습니다. 이 최적화 동작은 '$'기능 응용 프로그램에 고유 한 것입니까? 왜냐하면, 그 가치가 무엇인지 알 수 없기 때문에 아래의 편의를 위해 제공되는 '지도'와 '$'의 함수 정의에서 어떻게 이것이 나올지 알 수 없습니다.

처음부터 함수 식 앞에 '$ 3'이 있어야하지만 컴파일러에서는 계산되지 않습니다. 여기, 즉 겉으로 최적화의 확장 된 중간 표현 복용입니다 장소 :

[(4+) $3, (10*) $3, (^2) $3, sqrt $3] 

정의 - $

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

정의 - 예를 사용

map :: (a -> b) -> [a] -> [b] 
map _ [] = [] 
map f (x:xs) = f x : map f xs 

지도

map ($ 3) [(4+), (10*), (^2), sqrt] 

내가 정확하게, 당신은 당신이 ($ 3)를 작성하는 경우 어떻게되는지 궁금해하는 질문을 이해한다면 결과

[7.0,30.0,9.0,1.7320508075688772] 

답변

7

을 설정?

하스켈 구문에는 "Section of an infix operator"이라는 개념이 있습니다.

(2 +) == \x -> 2 + x == (+) 2 
(+ 2) == \x -> x + 2 == flip (+) 2 

하스켈은 기능 프로그래밍 언어이다 : 그것은 당신이 다음 (여기 +) 연산자와 표현식을 작성하는 경우 있음을 의미한다. 함수형 프로그래밍 언어의 한 측면은 함수를 매개 변수로 사용할 수 있다는 것입니다. 이것은 함수형 프로그래밍 언어에 국한되지 않습니다. Java, C#, C++ 등에서 함수/메소드 참조를 함수/메소드에 전달할 수 있습니다. 예를 들어 이러한 함수를 매개 변수로 호출 할 수 있습니다.

은 그래서 당신은 쓴 :

map (\x -> ($) x 3) [(4+), (10*), (^2), sqrt] 

\x -> ($) x 3는 그냥 평범한 기능입니다. 우리는이 첫 번째 인수에 적용 할 경우, 우리가 얻을 :

(\x -> ($) x 3) (4+) 
-> ($) (4+) 3 
-> (4+) 3 
-> 4 + 3 
-> 7 

는 그래서 ($ 3) 경우에 특별한 것은 없다, 우리는 연산자의 오른쪽에 기입 어떤 연산자와 함께 작동합니다.

사실 이미 (^2)으로 그 개념을 사용했습니다. 귀하의 목록은 실제로 다음과 같이 보입니다 :

map (flip ($) 3) [(+) 4, (*) 10, flip (^) 2, sqrt] 

그래서 목록의 요소에서 왼쪽과 오른쪽으로 구분을 사용했습니다.

+0

답변 해 주셔서 감사합니다. 그것은 위에 자리하고있다! –

+1

과 설명에 합리적인 우아함이 있습니다.나는 진심으로 당신이 시간을내어 주셔서 감사합니다! –

관련 문제