将IO [a - > b]应用于类型a的单个参数

Sav*_*xey 1 haskell functional-programming function

我有

functions :: IO[a -> b]   -- IO List of functions
param :: IO[a]            -- Single parameter
Run Code Online (Sandbox Code Playgroud)

而且我想得到

result :: IO[b]
result = IO[*first function* <$> param, *second function* <$> param, ...]
Run Code Online (Sandbox Code Playgroud)

我不知何故可以获得类型的结果IO[IO b],但我想要IO[b]

Aad*_*hah 7

通过"单个参数"我假设你的意思是一个元素列表.如果是这样,那么这就是它的完成方式:

result :: IO [b]
result = do
    fs <- functions    -- fs :: [a -> b]
    xs <- param        -- xs :: [a]
    let ys = fs <*> xs -- ys :: [b]
    return ys
Run Code Online (Sandbox Code Playgroud)

请注意,由于xs是一个元素列表,因此您实际上是应用fs该值的每个元素.

这与:

import Control.Applicative (liftA2)

result :: IO [b]
result = liftA2 (<*>) functions param
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • `liftA2(<*>)`是`(<*>)`用于`Compose`,所以你可以写`result = getCompose $ Compose functions <*> Compose param`.如果广泛使用这种模式,最好将所有内容包装在`Compose`中(例如`param:Compose IO [] a`和`result:Compose IO [] b`),那么它只是`result = functions <*> params`. (2认同)