4

からfmapの型クラスに関して定義できますか?DataData.Data

使用gfoldlすると型を変更できなかったようです..これを行うことができる他のコンビネーターはありますか?

の" "にしか影響を与える方法がないため、一般的なケースでは実行できないと思いますが、おそらく?RightaEither a aMaybe

fmap(簡単に導出できることは知っていますが、 を使用してこれを達成できるかどうかに興味がありますData

4

1 に答える 1

1

ここsybからの使用例は次のとおりです ここ

{-# LANGUAGE DeriveDataTypeable, ScopedTypeVariables, FlexibleContexts #-}
import Data.Generics
import Unsafe.Coerce

{- | C tags the type that is actually parameterized, so to avoid touching the
Int when a ~ Int:

> data T a = T Int a

by changing the type (not representation) to:

> x :: T Int (C Int)
-}
newtype C a = C a deriving (Data,Typeable)

fmapData :: forall t a b. (Typeable a, Data (t (C a)), Data (t a)) =>
    (a -> b) -> t a -> t b
fmapData f input = uc . everywhere (mkT $ \(x::C a) -> uc (f (uc x)))
                    $ (uc input :: t (C a))
    where uc = unsafeCoerce
于 2013-02-01T05:22:10.470 に答える