[英]IO values into haskell function
我目前有一个定义的函数:
f :: [Int] -> Int -> [[Int]]
并且有两个类型为 IO [Int] 和 IO Int 的变量。 我想将这些变量传递给这个函数 f。 当只有一个变量被传递给函数时,我能够做到这一点,但是当它是 2 时,我无法让它工作。
你可以写一个do
块:
f' :: IO [[Int]]
f' = do
x <- val1
y <- val2
return (f x y)
使用val1 :: IO [Int]
和val2 :: IO Int
您想要作为参数传递的值。
或以应用风格:
f' :: IO [[Int]]
f' = f <$> val1 <*> val2
或者我们可以使用liftA2 :: (a -> b -> c) -> fa -> fb -> fc
:
f' :: IO [[Int]]
f' = liftA2 f val1 val2
您应该在do
符号中使用<-
并在展开的值上运行该函数。
-- Implementations left out
xsFn :: IO [Int]
xFn :: IO Int
main = do
xs <- xsFn
x <- xFn
-- We've unwrapped the values, so now xs :: [Int] and x :: Int
let result = f xs x -- result :: [[Int]]
-- do something with result
return ()
IO
有一个Applicative
实例,所以你可以使用liftA2
:
> f = undefined :: [Int] -> Int -> [[Int]]
> import Control.Applicative
> :t liftA2 f
liftA2 f :: Applicative f => f [Int] -> f Int -> f [[Int]]
通过TypeApplications
扩展,您可以更清楚地看到它。
> :set -XTypeApplications
> :t liftA2 @IO f
liftA2 @IO f :: IO [Int] -> IO Int -> IO [[Int]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.