[英]Casting to a typeclass
我想實現一個泛型函數,它將嘗試將任何類型轉換為列表。 我試圖在Typeable
的幫助下實現這一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
定義的情況下也可以正常編譯,但是有了它,它就一直asList
着t0
類型變量的模棱兩可,我指的是a
。 現在,我嘗試了一些技巧,但是只有當我為演員表指定特定類型(例如Maybe [String]
或Maybe (Set String)
等Maybe (Set String)
,它才有效。
我的猜測是我必須用asFoldable
類型聲明來欺騙編譯器,但是它仍然無法正常工作,因為它不支持類型轉換。 這是真的? 有沒有更好的方法嘗試將任何類型轉換為列表? 有沒有?
沒有方法(沒有Template Haskell,這幾乎總是過大),無法動態測試類型類實例的存在。 以通用方式將任意結構轉換為其他任意結構的正確方法是使用Data.Data
,這是@hammar在另一個問題中談到的通用類型。
toTree :: Data a => a -> Tree String
toTree x = Node (show $ toConstr x) $ gmapQ toTree x
當然,正如@hammar也說過的那樣,您可能希望對列表和字符串進行不同的處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.