1

은 우리가 <$ 함수로 정의했습니다 :

class Functor f where 
    fmap  :: (a -> b) -> f a -> f b 

    (<$)  :: a -> f b -> f a 
    (<$)  = fmap . const 

const 기능은 정의가 있습니다

const     :: a -> b -> a 
const x _    = x 

나는 <$ 기능에 해당하는 것을 알고 :

\x -> fmap (const x) 

fmap . const은 위의 람다 식과 어떻게 같습니까? ? 기능 구성에 대한 나의 이해는 const의 출력 유형이 fmap의 입력 유형과 일치해야하지만, 입력 유형 fmap(a -> b)이 아니고 이 아니며 const 기능이 출력하는 것입니다.

+0

당신의 질문은 'Data.Map'에 대해'<$'의 정의를 확인하게 만들었습니다. 그것은 다음 릴리스에서 상당히 빠를 것입니다. 감사! – dfeuer

답변

4

다른 대답은 질문, "? 어떻게 fmap . const 위의 람다 식에 동일시 않습니다"를 해결하는 좋은 일을, 그래서 나는 다른 부분 해결하려면 :

기능 성분의 나의 이해입니다 const의 출력 유형이 fmap의 입력 유형과 일치해야하지만 입력 유형 fmap은 기능이 출력하는 (a -> b)이 아닌 a 기능입니다. 이 답변에

, 나는 const의 출력 유형이 fmap의 필요에 따라 함수가 참이라고 주장합니다.하나는 요청해야합니다 지금

fmap :: Functor f => (a -> b) -> (f a -> f b) 
const :: c -> (d -> c) 

: const의 출력 유형이 무엇

은의 혼동을 피하기 위해 각각 별도의 입력 변수를 사용하여, fmapconst의 유형을 다시 보자? 귀하의 질문에, 출력 유형이 c (위와 같이 유형 이름 바꾸기 유형을 정정 한 후)이라고 가정합니다. 그러나 사실 이것은 약간의 오해입니다. 실제 출력 유형은 d -> c입니다!

const의 출력은 실제로 기능입니다. 자, 말했듯이 출력은 fmap의 입력과 일치해야합니다. 위의 이름을 사용하면 방정식 d ~ a (읽기 : 유형 d 및 유형 a은 동일한 유형 임)을 충족하고 c ~ b을 만족해야합니다. 그러면 우리는 다음을 갖게 될 것입니다 :

const  :: b -> (a -> b) 
fmap   ::  (a -> b) -> (f a -> f b) 
fmap . const :: b    -> (f a -> f b) 
+0

이것은 내가 찾던 해답이다. 그래서 부분적으로 적용된 함수가 functor에 fmap되고있는 위의 내 의견은 정확하지 않습니다. 그것은 실제로 적용된 (d -> c) 함수였습니다. –

5

참고 것을 : 구체성에 대한

(f . g) x = f (g x) 

(참조 definition of (.)) 때문에,

(fmap . const) x = fmap (const x) 

원래 대답

,의는 IO 펑터를 사용하자.

fmap f은 계산 결과에 f을 적용하여 IO 계산을합니다.

예. - getContentsIO String이며, length은 문자열의 기능입니다, 그래서 우리는 getContents에 길이 fmap 함수 수 있습니다

getContents    :: IO String 
length     :: String -> Int 
fmap length getContents ::    IO Int 

이, 표준 입력을 모두 읽어 입력의 길이를 가지고 가고, (그것을 반환 실행하면 IO- 행동으로).

이제 const z은 인수를 무시하고 항상 z을 반환하는 함수입니다. 다음,

getContents     :: IO String 
const 'w'      :: String -> Char 
fmap (const 'w') getContents ::    IO Char 

실행이 먼저 표준 입력을 모두 읽을 것이라고 입력을 폐기하고 'W'문자를 리턴 : 나는 getContentsfmap (const 'w')에 있다면 그래서 난 것이다.

+0

예, 알고 있습니다. 그러나 내가 알고 싶은 것은 그 구성이 람다 표현과 어떻게 동등한가하는 것이다. –

+0

답변이 업데이트되었습니다. – ErikR

+0

사실,'const x'는 부분적으로 적용된 함수로,이 경우 전달 된 임의의 함수기에'fmap'을 적용합니다. –