Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 根据数据类型类定义fmap_Haskell_Metaprogramming - Fatal编程技术网

Haskell 根据数据类型类定义fmap

Haskell 根据数据类型类定义fmap,haskell,metaprogramming,Haskell,Metaprogramming,可以根据来自的Datatypeclass定义fmap 似乎使用gfoldl无法修改类型。。还有其他的组合子可以做到这一点吗 我猜这在一般情况下是做不到的,因为人们没有办法只影响a或a中的“权利”a,但也许在某些情况下,如或 (我知道fmap很容易推导,但我仍然对使用数据是否可以实现这一点感兴趣)下面是使用来自 下面给出了一个使用syb的示例。它使用了不安全性;不确定是否有一种不那么恶心的方式来做。@jberryman:你应该把它作为一个答案。 {-# LANGUAGE DeriveDataTyp

可以根据来自的
Data
typeclass定义
fmap

似乎使用
gfoldl
无法修改类型。。还有其他的组合子可以做到这一点吗

我猜这在一般情况下是做不到的,因为人们没有办法只影响a
或a
中的“
权利
a
,但也许在某些情况下,如


(我知道
fmap
很容易推导,但我仍然对使用
数据是否可以实现这一点感兴趣)

下面是使用来自


下面给出了一个使用
syb
的示例。它使用了
不安全性
;不确定是否有一种不那么恶心的方式来做。@jberryman:你应该把它作为一个答案。
{-# 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