2012-09-09 5 views
37

나는 flip id이라는 표현에 대해 궁금합니다 (숙제가 아닙니다 : getOpt 문서에서 찾았습니다).왜 하스켈의 "플립 아이디"에는이 유형이 있습니까?

는 나는이 유형이 이유를 궁금해 : 예를 들어

Prelude> :t (flip id) 
(flip id) :: b -> (b -> c) -> c 

(flip id) 5 (+6)11을 제공합니다.

나는 id (+6) 5이 11을 제공하는 이유를 알고 있지만, 나는 flip id 것을 "얻지"않습니다.

필자는 펜과 종이를 사용하여이 사실을 파악하려고했지만 그렇게 할 수 없었다. 아무도 나에게 이걸 설명하지 않을 수 있니? 내 말은, flip id은 어떻게 b -> (b -> c) -> c이 될까요?

답변

66

id 기능이 유형이있다 : 당신이 교체 할 때

id :: a -> a 

당신은이 유형의 인스턴스를 얻을를 aa -> b의 : 무두질의,과 동일하기 때문에,

id :: (a -> b) -> (a -> b) 

:

id :: (a -> b) -> a -> b 

이에당신이 얻을 : id (+)의 경우

flip id :: a -> (a -> b) -> b 

를 인스턴스는 다음과 같습니다

flip id :: (Num a) => a -> (a -> a) -> a 

사이드 참고 : 이제

id :: (Num a) => (a -> a) -> (a -> a) 

flip id 당신에게 제공이는 방법을 보여줍니다 ($)id과 같으며 제한 유형이 더 있습니다 :

($) :: (a -> b) -> a -> b 
($) f x = f x 
-- unpoint: 
($) f = f 
-- hence: 
($)  = id 
+11

안녕하세요, 등록되지 않은 [다른 계정] (http://stackoverflow.com/users/1488832/ertes)이있는 것 같습니다. 계정을 등록하면 [병합] 할 수 있습니다 (http://meta.stackexchange.com/questions/18232/how-can-one-link-merge-combine-associate-two-accounts-users-anonymous-unregist).) 그리고 나서 모든 대답에 대해 하나의 계정을 만드십시오 (그런데 정말 좋습니다!). – huon

+0

감사합니다. 훌륭한 답변입니다. '$ '에 대한 당신의 언급은 이해하기가 더 직관적이게하고 당신이 그것을 버리지 않았기 때문에 기쁩니다. 당신의 대답을 완전히 이해하기 위해서는 며칠이 더 걸릴 것입니다. –

+3

좋은 답변입니다. 'flip id'를'flip ($)'로 생각하면 많은 도움이됩니다. – Garrett