簡體   English   中英

轉換為類型類

[英]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定義的情況下也可以正常編譯,但是有了它,它就一直asListt0類型變量的模棱兩可,我指的是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM