人們可以把這種情況下的如下曖昧類型變量'A1' : 應用程序動態加載模塊,或存在的用戶從中選擇的功能列表,等等。我們有一個機制來確定某個類型是否可以成功地在該模塊中使用一個函數。所以現在我們要調用這個函數。我們需要強制它打電話。該函數可以採用具體類型,也可以採用多態類型,下面只是一個類型約束,我遇到了問題。如何解決這個編譯錯誤:在約束
下面的代碼會導致以下錯誤。我認爲可以通過指定具體類型來解決,但我不想這樣做。該代碼旨在與任何類型的實例一起工作。指定具體類型會破壞目的。
這是模擬程序,不知道其他,不知道是什麼類型它處理的一個組成部分。我有一個單獨的機制,可以確保類型能夠正確匹配,確實發送的值是類型類的一個實例。這就是爲什麼在這種情況下,我不介意使用unsafeCoerce。但基本上我需要一種方法告訴編譯器,我確實知道它是可以的,無論如何,儘管它不知道鍵入check。
{-# 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
運行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
運行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
看來答案是:你不能。因此,我將開始一個新的問題,詢問如何去做我想做的事情,並希望有一些方法可以做到與我所採取的方法不同。 – mentics