任意の型をリストに変換しようとするジェネリック関数を実装したいと思います。私は:の助けを借りてこれを達成しようとしましたTypeable
:
import Data.Data
import Data.Foldable
import Control.Applicative
asFoldable :: (Typeable (a b), Foldable z, Typeable (z b)) => a b -> Maybe (z b)
asFoldable = cast
asList :: (Typeable1 a, Typeable b) => a b -> Maybe [b]
asList x = Data.Foldable.foldr (:) [] <$> asFoldable x
上記のコードは、asList
定義がなくても問題なくコンパイルされますが、それを使用すると、t0
型変数のあいまいさを吠え続けa
ます。今、私はそれをだまそうとしましたが、Maybe [String]
orMaybe (Set String)
などのキャストに特定のタイプを指定した場合にのみ機能します。
私の推測では、asFoldable
型宣言でコンパイラーをだますことができましたが、型クラスへのキャストをサポートしていないため、それでも機能しません。これは本当ですか?任意のタイプをリストに変換しようとするより良い方法はありますか?何かありますか?