代码之家  ›  专栏  ›  技术社区  ›  Fabus1184

Haskell mapM_不打印

  •  0
  • Fabus1184  · 技术社区  · 2 年前

    所以我写了一个程序来查询一个外汇API(外汇),它工作起来很有魅力,但是当我想查询每一个可用的货币对时,它会计算所有的API调用,因为它需要很长时间来执行,但不会打印任何内容。

    import Data.Functor ((<&>))
    
    supportedPairs :: IO (Maybe [(String, String)])
    forex :: String -> String -> IO (Maybe (Scientific, UnixTime))
    
    
    main :: IO ()
    main = do
        x <- supportedPairs
        mapM_ (flip (<&>) print . uncurry forex) (fromJust x)
        -- this prints nothing at all
    
    

    单打电话的工作原理如下:

    main = do
        x <- supportedPairs    
        u <- (uncurry forex . (flip (!!) 10 . fromJust)) x
        print u
        -- this prints "Just (438.685041,UnixTime {utSeconds = 1649588583, utMicroSeconds = 0})"
    

    为什么 mapM_ 尽管结果已被评估,但是否打印结果?如果我正确理解哈斯凯尔的懒惰,那么如果结果不被打印出来,就不应该首先对其进行评估?

    1 回复  |  直到 2 年前
        1
  •  2
  •   chi    2 年前

    检查类型:

    print ... -> IO () .

    因此 ... <&> print IO (IO ()) 注意这里的双IO。

    因此,在上面映射将运行“最外层IO”,而不是“最内层IO”。更具体地说,比较一下:

    main = do
      x <- print True >> return 5          -- x is 5
      y <- return (print True >> return 5) -- y is an IO action
      ...
    

    只有第一个 print True 执行如下:第二个IO操作用于定义 y 但在我们逃跑之前 Y 它不会被执行。

    最后一点:在这里,你不需要 <&> 因为这会创建嵌套IO。请使用 flip (>>=) print (或 (=<<) print (>>= print) )而不是 flip <&> print .