해결합니다.이 코드를 고려 유형의 오류
Foo.hs:16:17:
Could not deduce (Foo a) arising from a use of ‘bar’
from the context (SomeClass a)
bound by the type signature for foo :: SomeClass a => a -> Int
at Foo.hs:15:8-32
Possible fix:
add (Foo a) to the context of
the inferred type of x :: Int
or the type signature for foo :: SomeClass a => a -> Int
In the expression: bar t
In an equation for ‘x’: x = bar t
In the expression: let x = bar t in x
는이 문제를 해결하는 방법은 두 가지가 있습니다 : 대신, GHC는 그래서 Foo a => SomeClass a
예를 사용하여 수행해야합니다 가정 foo
에서
- ,
bar t
- 에
let x = bar t in x
변화에 라인instance SomeClass Int
을 덧붙이을 내 프로그램
여기 무슨 일이 일어나고 있습니까? 이 문제가 발생하는 이유는 무엇이며 왜 이러한 수정이 효과가 있습니까?
이 예제는 물론 실제 문제로 단순화되었습니다. 다국어 변환을위한 Cubix 프레임 워크 (arxiv.org/pdf/1707.04600)에서 작업하는 동안 발생했습니다.
내 실제 문제는 제약 조건 InjF f IdentL FunctionExpL
("f는 식별자가 함수 호출에서 함수를 나타내는 데 사용될 수있는 언어입니다")가있는 함수와 관련됩니다. 내가 (거짓) Could not deduce FunctionIdent :<: f
오류를주는, typechecker가 점유에 (overlappable) 인스턴스 (FunctionIdent :<: f) => InjF f IdentL FunctionExpL
있습니다.
특정 Foo
의 범위에 InjF Foo IdentL FunctionExpL
인스턴스가있는 경우에도이 오류가 지속되므로 다른 인스턴스가 문제를 해결해야한다고 예측하는 leftaroundabout의 답변은 전체 기사가 아닙니다.
'{- # OVERLAPPABLE # -}'과'{- # LANGUAGE FlexibleContexts # -} '는 아무런 영향을주지 않습니다. 컴파일을하는 또 다른 방법 :'x' :: Int'를'let' 바인딩에 추가하십시오. – Alec
아마도 가장 시끄러운 것은 모듈의 all_에 인스턴스가 없을 때 typechecks ... – leftaroundabout