我有一个函数seperateFuncs
这样
seperateFuncs :: [a -> b] -> (a -> [b])
seperateFuncs xs = \x -> map ($ x) xs
我想知道相反的情况是否存在,即是否有一个函数
joinFuncs :: (a -> [b]) -> [a -> b]
我认为不是(主要是因为列表的长度不固定),但也许我会被证明是错的。
那么问题是有一些数据类型f
它有一个函数 :: (a -> f b) -> f (a -> b)?
你可以概括一下seperateFuncs
to Applicative
(or Monad
)非常干净:
seperateFuncs :: (Applicative f) => f (a -> b) -> (a -> f b)
seperateFuncs f x = f <*> pure x
以无点风格编写,你有seperateFuncs = ((. pure) . (<*>))
,所以你基本上想要unap . (. extract)
,如果您以尖锐的方式编写它,则给出以下定义:
joinFuncs :: (Unapplicative f) => (a -> f b) -> f (a -> b)
joinFuncs f = unap f (\ g -> f (extract g))
这里我定义Unapplictaive
as:
class Functor f => Unapplicactive f where
extract :: f a -> a
unap :: (f a -> f b) -> f (a -> b)
为了得到leftaroundabout 给出的定义 https://stackoverflow.com/a/13766031/824425,您可以给出以下实例:
instance Unapplicative [] where
extract = head
unap f = [\a -> f [a] !! i | i <- [0..]]
instance Unapplicative ((->) c) where
extract f = f undefined
unap f = \x y -> f (const y) x
我认为很难想出一个“有用”的功能f :: (f a -> f b) -> f (a -> b)
对于任何f
那不像(->)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)