作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了这样一种情况,我的代码可以从使用 Functor
中受益。和 Applicative
- 类似抽象,但用于类型 (* -> *) -> *
.可以使用 RankNTypes
定义更高种类的仿函数像这样
class HFunctor f where
hfmap :: (forall x. a x -> b x) -> f a -> f b
Applicative
的更高版本有点棘手。这是我能想到的最好的:
class HFunctor f => HApplicative f where
hpure :: (forall x. a x) -> f a
(<**>) :: f (a :-> b) -> f a -> f b
newtype (:->) a b x = HFunc (a x -> b x)
infixr 5 :->
:->
包装器类型,以便具有
* -> *
类型的函数, 但这并不能让我们像
<$>
那样很好地链接函数应用程序。和
<*>
对于正常的应用程序。我可以使用助手进行管理,例如
liftHA2 :: HApplicative f => (forall x. a x -> b x -> c x) -> f a -> f b -> f c
liftHA2 f fa fb = hpure (fun2 f) <**> fa <**> fb where
fun2 = HFunc . (HFunc .)
data Example f = Example (f Int) (f String)
instance HFunctor Example where
hfmap f (Example i s) = Example (f i) (f s)
instance HApplicative Example where
hpure a = Example a a
Example (HFunc fi) (HFunc fs) <**> Example i s = Example (fi i) (fs s)
e :: Example []
e = Example [1,2,3] ["foo", "bar"]
e' :: Example ((,) Int)
e' = hfmap (length &&& head) e -- Example (3,1) (2, "foo")
e'' :: Example []
e'' = liftHA2 (++) e e -- Example [1,2,3,1,2,3] ["foo", "bar", "foo", "bar"]
Functor2
在
linear-maps
和
HFunctor
在
multi-rec
但两者都不是我需要的。
HApplicative
没有
:->
包装器或其他使功能提升更容易的方法?
最佳答案
我倾向于想到的HFunctor是(* -> *) -> * -> *
-- 即仿函数上的合法仿函数。这与您所想的具有不同的特征。
以下是如何定义它,以及它上面的应用程序的“monoidal”版本。
type Nat f g = forall a. f a -> g a
class HFunctor (f :: (* -> *) -> * -> *) where
hfmap :: (Nat g h) -> Nat (f g) (f h)
data Prod f g a = Prod (f a) (g a)
class HFunctor f => HApplicative f where
hpure :: Nat g (f g)
htensor :: Nat (Prod (f g) (f h)) (f (Prod g h))
关于haskell - kind 类型 (* -> *) -> * 的仿函数和应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18052158/
我是一名优秀的程序员,十分优秀!