簡體   English   中英

將 IO 值轉換為 haskell 函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM