次のコードを GHC から取得するのに苦労しています。
getFirstChild :: (WidgetClass w1, WidgetClass w2) => w1 -> IO (Maybe w2)
getFirstChild parent = do
-- check if parent is a container
if parent `isA` gTypeContainer
-- if parent is a container get the first child
then do children <- containerGetChildren $! castToContainer parent
return $! Just $! children !! 0
else return Nothing
一見 Gtk2hs の質問のように見えますが、実際には Haskell 型システムに関するものです。
このコードを GHC でコンパイルしようとすると、次のエラー メッセージが表示されます。
Could not deduce (w2 ~ Widget)
from the context (WidgetClass w1, WidgetClass w2)
bound by the type signature for
getFirstChild :: (WidgetClass w1, WidgetClass w2) =>
w1 -> IO (Maybe w2)
at HsFu\Gtk\Widget.hs:(6,4)-(12,28)
`w2' is a rigid type variable bound by
the type signature for
getFirstChild :: (WidgetClass w1, WidgetClass w2) =>
w1 -> IO (Maybe w2)
at HsFu\Gtk\Widget.hs:6:4
Expected type: [w2]
Actual type: [Widget]
In the first argument of `(!!)', namely `children'
In the second argument of `($!)', namely `children !! 0'
のタイプcontainerGetChildren
は次のとおりです。
containerGetChildren :: ContainerClass self => self -> IO [Widget]
Widget
型自体が のインスタンスであるため、関数の戻り値の型をのインスタンスとして指定WidgetClass
できない理由がわかりません。getFirstChild
w2
WidgetClass
のようなものを使わずに Haskell でこれを表現する方法はありunsafeCoerce
ますか?
ティア