제약 조건의 모호한 유형 변수 'a1'이 경우를 다음과 같이 생각할 수 있습니다. 응용 프로그램이 동적으로 모듈을로드하거나 사용자가 선택하는 함수 목록이 있습니다. 우리는 특정 유형이 해당 모듈의 기능과 함께 성공적으로 작동하는지 여부를 결정하는 메커니즘을 가지고 있습니다. 이제 우리는 그 함수를 호출하려고합니다. 우리는 전화를 걸도록 강요해야합니다. 이 함수는 구체적인 유형 또는 다형성을 취할 수 있으며 그 유형에 따라 문제가있는 유형 클래스 제약 조건이 아래에 있습니다.이 컴파일 오류를 해결하는 방법은 무엇입니까?
다음 코드는 아래 오류를 발생시킵니다. 구체적인 유형을 지정하여 해결할 수 있다고 생각하지만 그렇게하고 싶지는 않습니다. 이 코드는 클래스의 인스턴스 인 모든 유형에서 작동하도록 만들어졌습니다. 구체적인 유형을 지정하면 그 목적을 무효화합니다.
이것은 다른 프로그램에 대해 모르는 프로그램의 한 부분을 시뮬레이트하고 처리 대상의 유형을 모릅니다. 나는 유형이 적절하게 일치하는지, 실제로 전송 된 값이 유형 클래스의 인스턴스인지를 확인하는 별도의 메커니즘을 가지고있다. 그래서이 경우 unsafeCoerce를 사용해도 상관 없습니다. 하지만 기본적으로 컴파일러에게 내가 정말로 확인한다는 것을 알 수있는 방법이 필요합니다. 어쨌든 형식 검사를하기에 충분하지 않더라도 그렇게 할 수 있습니다. doTest2
[1 of 1] Compiling Main (Test.hs, Test.o)
Test.hs:12:3:
Ambiguous type variable `a1' in the constraint:
(HasString a1) arising from a use of `test'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: test
In the expression: test $ unsafeCoerce h
In an equation for `doTest1':
doTest1 [email protected](Hider h) = test $ unsafeCoerce h
실행 doTest1
을
[1 of 1] Compiling Main (Test.hs, Test.o)
Test.hs:12:3:
Ambiguous type variable `a1' in the constraint:
(HasString a1) arising from a use of `test'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: test
In the expression: test $ unsafeCoerce h
In an equation for `doTest1':
doTest1 [email protected](Hider h) = test $ unsafeCoerce h
실행
는{-# LANGUAGE ExistentialQuantification, RankNTypes, TypeSynonymInstances #-}
module Main where
import Unsafe.Coerce
main = do
--doTest1 $ Hider "blue"
doTest2 $ Hider "blue"
doTest1 :: Hider -> IO()
doTest1 [email protected](Hider h) =
test $ unsafeCoerce h
doTest2 :: Hider -> IO()
doTest2 [email protected](Hider h) =
test2 hh
test :: HasString a => a -> IO()
test x = print $ toString x
test2 :: Hider -> IO()
test2 (Hider x) = print $ toString (unsafeCoerce x)
data Hider = forall a. Hider a
class HasString a where
toString :: a -> String
instance HasString String where
toString = id
답변은 다음과 같습니다. 할 수 없습니다. 따라서, 나는 내가하고 싶은 일을하는 법을 묻는 새로운 질문을 시작할 것이고, 내가 취하는 접근 방식과는 다른 방식으로 그것을 할 수 있기를 희망한다. – mentics