昇格されたデータ型には、昇格されたデータの種類のメンバーである固定数の型があります。この閉ざされた世界では、明示的にスコープ内にある辞書なしで、型クラスで関数の呼び出しをサポートすることは理にかなっていますか?
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
data DataType = Constructor
data DataTypeProxy (e :: DataType) = DataTypeProxy
class Class (e :: DataType) where
classFunction :: DataTypeProxy e -> IO ()
-- this is the only instance that can be created
instance Class 'Constructor where
classFunction _ = return ()
-- adding the Class constraint fixes the build break
-- disp :: Class e => DataTypeProxy e -> IO ()
disp :: DataTypeProxy e -> IO ()
disp = classFunction
main :: IO ()
main = disp (DataTypeProxy :: DataTypeProxy 'Constructor)
この不自然な例は、GHC head では機能しません。まったく驚くべきことではありませんが、DataKind
拡張機能によってこれが可能になるようです。
test.hs:18:8:
No instance for (Class e) arising from a use of `classFunction'
Possible fix:
add (Class e) to the context of
the type signature for disp :: DataTypeProxy e -> IO ()
In the expression: classFunction
In an equation for `disp': disp = classFunction