Haskell函数来自(a - > [b]) - > [a - > b]

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

您可以推广seperateFuncsApplicative(或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不喜欢的东西提出"有用"的功能(->).