【问题标题】:IO values into haskell functionIO 值转换为 haskell 函数
【发布时间】:2020-02-19 20:40:09
【问题描述】:

我目前有一个有定义的函数:

f :: [Int] -> Int -> [[Int]]

并且有两个类型为 IO [Int] 和 IO Int 的变量。我想将这些变量传递给这个函数 f。当它只有一个变量被传递给函数时,我能够做到这一点,但是当它是 2 时,我无法让它工作。

【问题讨论】:

  • IO Int 类型的变量中的值是您可以获得 Int 的方法。例如“让用户输入一个数字”是一个 IO Int 类型的值。您无法计算“让用户输入一个数字”+“选择一个随机数”。您必须让用户输入一个数字,然后选择一个随机数,然后计算第一个数字 + 第二个数字。

标签: haskell io


【解决方案1】:

你可以写一个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 -&gt; b -&gt; c) -&gt; f a -&gt; f b -&gt; f c:

f' :: IO [[Int]]
f' = liftA2 f val1 val2

【讨论】:

    【解决方案2】:

    您应该在 do 表示法中使用 &lt;- 并在未包装的值上运行该函数。

    -- 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 ()
    

    【讨论】:

      【解决方案3】:

      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]]
      

      【讨论】:

        猜你喜欢
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        • 2011-09-17
        • 2013-03-16
        • 2013-12-23
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多