wal*_*pen 7 haskell function list
我有一个功能seperateFuncs,使得
seperateFuncs :: [a -> b] -> (a -> [b])
seperateFuncs xs = \x -> map ($ x) xs
Run Code Online (Sandbox Code Playgroud)
我想知道反过来是否存在,即是否存在功能
joinFuncs :: (a -> [b]) -> [a -> b]
Run Code Online (Sandbox Code Playgroud)
我认为不是(主要是因为列表不是固定的长度),但也许我会被证明是错的.那么问题是有一些数据类型f有一个函数::(a - > fb) - > f(a - > b)?
小智 7
您可以推广seperateFuncs到Applicative(或Monad)非常干净:
seperateFuncs :: (Applicative f) => f (a -> b) -> (a -> f b)
seperateFuncs f x = f <*> pure x
Run Code Online (Sandbox Code Playgroud)
你可以用无点样式编写seperateFuncs = ((. pure) . (<*>)),所以你基本上想要unap . (. extract),如果你用有点的风格写它,给出以下定义:
joinFuncs :: (Unapplicative f) => (a -> f b) -> f (a -> b)
joinFuncs f = unap f (\ g -> f (extract g))
Run Code Online (Sandbox Code Playgroud)
在这里我定义Unapplictaive为:
class Functor f => Unapplicactive f where
extract :: f a -> a
unap :: (f a -> f b) -> f (a -> b)
Run Code Online (Sandbox Code Playgroud)
要获得leftaroundabout给出的定义,您可以提供以下实例:
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
Run Code Online (Sandbox Code Playgroud)
我认为很难f :: (f a -> f b) -> f (a -> b)为任何f不喜欢的东西提出"有用"的功能(->).