【发布时间】:2014-11-01 11:39:07
【问题描述】:
假设我有一个适用的数据类型A。 (为了这个例子,我们可以假设A 是Identity)。
我现在有一个新的数据类型,它对应于从一个A 到另一个的“转换”:
data B a b = B (A a -> A b)
我想为 (B a) 定义一个简单的 Applicative 实例,它会产生一个新的转换,将 <*> 的两个参数应用于其输入,然后使用 A 的 Applicative 实例中的 定义。
制定这个很简单:
instance Applicative (B a) where
pure x = B $ const $ pure x
(B ftrans) <*> (B xtrans) = B fxtrans
where fxtrans inp = let fout = ftrans inp
xout = xtrans inp
in fout <*> xout
但是,我觉得应该有一种直接的无点写法,因为(-> a) 是一个 Applicative Functor。
作为我的想法的一个示例,请考虑我对相应 Functor 实例的定义:
instance Functor (B a) where
fmap f (B xtrans) = B $ (fmap f) <$> xtrans
是否有类似的简单方法来定义 Applicative 实例?
【问题讨论】:
标签: haskell functional-programming typeclass