2011-04-29 2 views
5

Haskell에서 GHCi (버전 6.12.3)를 사용하고 있습니다. 나는 최근에 펑터 (functor)에 대해 읽었고 응용 펑터 (applicative functor)는 응용 펑터의 <*>과 유사하지 않은 것이 펑터의 프리미티브를 사용하여 구현 될 수 없다고 생각했다. 어떤 사고 후 나는 다음과 같은 오류가있어 더 일반적으로 A (거의) 이상Haskell - fmap fmap이 작동하지 않습니다.

Functor f => f (a -> b) -> f (f a -> f b) 의 종류 나

(Functor f1, Functor f2) => f1 (a -> b) -> f1 (f2 a -> f2 b)

내가
let q = fmap fmap 

을 시도

있을 것이다 fmap fmap 함께했다

<interactive>:1:8: 
    Ambiguous type variable `f1' in the constraint: 
     `Functor f1' arising from a use of `fmap' at <interactive>:1:8-16 
    Probable fix: add a type signature that fixes these type variable(s) 

<interactive>:1:13: 
    Ambiguous type variable `f' in the constraint: 
     `Functor f' arising from a use of `fmap' at <interactive>:1:13-16 
    Probable fix: add a type signature that fixes these type variable(s) 

제안 된대로 위의 형식 서명을 쓰는 것이 도움이되지 않았습니다. 가장 이상한 점은 내가 입력했을 때 :t fmap fmap 위와 동일한 유형이 있습니다.

내가 뭘 잘못하고 있니? fmap fmap이 GHCi가 유형을 찾았는데 왜 유형 오류가 발생합니까?

답변

7

monomorphism restriction에 게재되는 것처럼 보입니다.

GHCi에서 예제를 -XNoMonomorphismRestriction으로 시도하면 예상되는 결과를 얻을 수 있습니다.

또한 이것을 let f x = fmap fmap $ x으로 작성하여 뒤집을 수도 있습니다. 단조 제한은 "모양과 유사"한 값 (예 : f = something)에만 적용되므로 명시 적 인수를 사용하면 더 이상 적용되지 않습니다. 이것이 최상위 수준이 아니면 (예 : where 절) 적용되지 않습니다. 자세한 내용은 링크를 참조하십시오.

+1

당신의 영혼이 작용하기 때문에 그것은 단관절 제한 인 것처럼 보입니다. 감사. 하지만 형식을 지정했을 때 왜 작동하지 않습니까? – Mafi

1

나는 어디에서나 의견을 말할 수 없으므로 답변을 게시 할 것입니다. 앞에서 언급했듯이 오류는 monomorphism 제한 때문에 발생합니다. 원본 질문에 주어진 두 가지 중 하나에 형식 서명을 고정하면 ghci가 실제로 원하는대로 행복하게 만들 수 있습니다. 아마도 구문이 약간 잘못되었을 수 있습니다.

 
Prelude> let q :: (Functor f) => f (a -> b) -> f (f a -> f b); q = fmap fmap 
Prelude> :t q 
q :: (Functor f) => f (a -> b) -> f (f a -> f b) 

Prelude> let q :: (Functor f1, Functor f2) => f1 (a -> b) -> f1 (f2 a -> f2 b); q = fmap fmap 
Prelude> :t q 
q :: (Functor f1, Functor f2) => f1 (a -> b) -> f1 (f2 a -> f2 b) 
+0

그래, 방금 구문이 틀렸어. 감사 – Mafi