この問題は、ツリー ビューのモデルが異なる可能性があることに起因しています。関数TreeView a -> ListStore a
は部分的 (異なるモデルのツリービューに対して定義されていない) であるため、安全に使用できません。
この問題は、gtk2hs の tracおよびStack Overflowで何度も提起されています。提案された解決策は、あなたが言及し、避けたいものと常に似ています。
完全にはわかりませんが、次の行に沿った何かが安全でないキャストを実装すると思います:
unsafeCastToListStore :: TreeView a -> ListStore a
unsafeCastToListStore =
unsafeCastGObject . toGObject . treeViewGetModel
glib ライブラリの関数を使用してGObject
、モデルが実際に aListStore
であるかどうかを判断し、キャストを安全にすることができます。再チューニングMaybe (ListStore a)
。
特に、 を参照することをお勧めしisA :: GObjectClass o => o -> GType -> Bool
ます。悲しいことに、他の関数がfor a をgtk_list_store_get_type
提供できない場合は、FFI を介してC 関数を使用する必要があるかもしれません。GType
ListStore
あるいは、gtk2hs の独自のフォークをコンパイルしてバインドできる場合は、gtk がエクスポートするが gtk2hs がそうしない内部関数/モジュールを再エクスポートするだけでよいかもしれません (これがクローズド ソース プロジェクトまたは内部使用のためである場合)。 )、ただし、追加のメンテナンス コストが発生します。