2014-08-30 2 views
2

나는 화살표를 사용하여 성가신 문제에 직면했다. 구현 한 모든 함수에 대해 명시 적 유형을 제공해야한다. 나는 내가 명시 적 유형을 제공 할 수haskell과 Arrows에서 타입 추론

No instance for (Arrow a0) arising from a use of ‘...’ 
The type variable ‘a0’ is ambiguous 

같은 출력을 몇 가지 오류를 GHC 제공하지하지만 내가 몇 가지 기능을 변경할 때마다로 모든 기능에 의존의 내가 수동으로 유형을 변경해야 할 가능성이있어, 아주 성가신 경우 변경되었습니다.

강제로 ghc가 함수 유형을 자동으로 추론 할 수 있습니까?

정확히 같은 의미

import Control.Arrow 

ss :: forall a b c. (Arrow a) => (b -> c) -> a b c 
ss = arr 

와 코드가 꽤 잘 컴파일 동안

No instance for (Arrow a0) arising from a use of ‘arr’ 
    The type variable ‘a0’ is ambiguous 
    Relevant bindings include 
     ss :: (b -> c) -> a0 b c (bound at src/Main.hs:62:1) 
    Note: there are several potential instances: 
     instance Arrow Coroutine -- Defined at src/Main.hs:33:10 
     instance Arrow (->) -- Defined in ‘Control.Arrow’ 
     instance Monad m => Arrow (Kleisli m) -- Defined in ‘Control.Arrow’ 
    In the expression: arr 
    In an equation for ‘ss’: ss = arr 

원인

사소한 경우

import Control.Arrow 

ss = arr 
.

+0

필자는 이것이 반드시 복제본이어야한다고 생각하지만, 단조 제한으로 인해 모호한 유형 오류가있는 다른 질문을 아직 찾지 못했습니다. –

답변

3

가장 쉬운 것은 단사 사상 제한을 해제하는 것입니다 - 소스 파일의 상단에이를 넣어 :

{-# LANGUAGE NoMonomorphismRestriction #-} 

하여 오류의 이유는 하스켈이 ss 미세의 유형을 추론 할 수 있지만, 단사 사상 제한은 명시 적 형식 서명이없는 한 유형의 최상위 레벨 정의에서 유형이 유형 클래스 (예 : Arrow)에 대해 다형성이 아니어야합니다.

관련 문제