コンストラクターでシンボルを使用して新しい型を作成し、IncoherentInstances をオンにすると、コンパイル時にシンボルが入力された場合にのみ、型の正しいインスタンスが選択されます....
{-# LANGUAGE DataKinds, GADTs, KindSignatures, FlexibleInstances, IncoherentInstances #-}
import GHC.TypeLits
data Object:: Symbol -> * where
Object :: Object sy
instance Show (Object "dog") where
show _ = "dog"
instance Show (Object x) where
show _ = "other"
main = do
let name = "dog"
print (undefined :: Object "dog") -- outputs "dog", as expected
print (undefined :: Object "cat") -- outputs "other", as expected
print (undefined :: Object name) -- outputs "other", I expected "dog"
実行時に文字列 Symbol 値を提供する方法はありますか? これが許可されていない場合、なぜそれはコンパイルされますか (つまり、デフォルトのケース以外に解決されない場合、3 番目の印刷で割り当てを使用したいのはいつですか?)