이 코드를 int로. 나는 전환이 필요하다는 것을 알고있다.변환 형 가족 인스턴스는
class IdToInt a where
idToInt :: Id a -> Int
instance IdToInt Box where
idToInt s = s
을 그리고 실제로 컴파일 :
나는 어쩌면 클래스가 작동합니다 만들 생각했다. 내가 시도 할 때이 기능을 사용하려면
testFunc :: Id a -> Int
testFunc x = idToInt x
내가 오류 :
그래서
src/Snowfall/Spatial.hs:29:22:
Couldn't match type `Id a0' with `Id a'
NB: `Id' is a type function, and may not be injective
In the first argument of `idToInt', namely `x'
In the expression: idToInt x
In an equation for `testFunc': testFunc x = idToInt x
, 어떻게 int를 얻을 수있는 유형의 가족 ID에 대한 변환을 만들 수 있습니까? ehird로 답변에 따라
, 나는 다음과 같은 시도했지만 중 하나가 작동하지 않습니다 : 당신은 할 수 없습니다src/Snowfall/Spatial.hs:45:22:
Could not deduce (Id a0 ~ Id a)
from the context (IdStuff a)
bound by the type signature for
testFunc :: IdStuff a => Id a -> Int
at src/Snowfall/Spatial.hs:45:1-22
NB: `Id' is a type function, and may not be injective
In the first argument of `idToInt', namely `x'
In the expression: idToInt x
In an equation for `testFunc': testFunc x = idToInt x
감사합니다. 나는 아직도 그것을 얻지 못하고있다. 질문에 답을 기반으로 결과를 게시하여 제대로 형식을 지정했습니다. – mentics
@taotree : 아, 데이터 유형 패밀리가 아닌 유형 동의어 패밀리를 사용하고 있기 때문입니다. 이 특정 문제는 실제로 버그 일지 모르지만 일반적으로 동의어를 입력하면 꽤 쓸모가 없습니다. 두 인스턴스가 같은 연관 타입을 갖는 것은 완벽하게 가능하기 때문에, GHC는 무엇이든 추론하는 것을 거의 포기하고 엉망이됩니다. 데이터 유형 패밀리를 사용하면 모든 것을 해결할 수 있습니다. – ehird