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

在这种情况下如何使用mapM

  •  0
  • rnso  · 技术社区  · 6 年前

    我正在尝试打印的结果的不同组成部分 autocorrelation

    import Data.Vector as V
    import Statistics.Autocorrelation
    import Data.Typeable
    
    sampleA = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4]
    
    main = do
        let res = autocorrelation $ V.fromList sampleA
        putStr "Type of result of autocorrelation test: "
        print $ typeOf res
        print res
        -- Prelude.mapM_ print res      -- not working; 
    

    Type of result of autocorrelation test: ((Vector Double),(Vector Double),(Vector Double))
    
    ([1.0,2.5e-2,-0.45,-0.325,0.5,0.125,-0.15],[1.0,-1.3255000000000001,-1.4039375473415425,-1.442999810318651,-1.5311377955236107,-1.5364636906417393,-1.544097864842309],[1.0,1.0755000000000001,1.1539375473415425,1.192999810318651,1.2811377955236107,1.2864636906417393,1.294097864842309])
    

    但是,如果取消最后一行的注释,则会出现错误:

    • No instance for (Foldable ((,,) (Vector Double) (Vector Double)))
        arising from a use of ‘Prelude.mapM_’
    • In a stmt of a 'do' block: Prelude.mapM_ print res
      In the expression:
        do { let res = autocorrelation $ fromList sampleA;
             putStr "Type of result of autocorrelation test: ";
             print $ typeOf res;
             print res;
             .... }
      In an equation for ‘main’:
          main
            = do { let res = ...;
                   putStr "Type of result of autocorrelation test: ";
                   print $ typeOf res;
                   .... }
    

    如何在单独的行上打印结果的所有部分?谢谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Daniel Wagner    6 年前

    最简单的就是模式匹配。

    main = do
        let (a,b,c) = autocorrelation $ V.fromList sampleA
        print a
        print b
        print c
    
        2
  •  4
  •   Joseph Sible-Reinstate Monica    6 年前

    不想模式匹配你自己,你可以用 the fixed-vector package 来帮助你。请注意,它有自己的 mapM_ 你必须使用:

    import Data.Vector as V
    import qualified Data.Vector.Fixed as F
    import Statistics.Autocorrelation
    import Data.Typeable
    
    sampleA = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4]
    
    main = do
        let res = autocorrelation $ V.fromList sampleA
        putStr "Type of result of autocorrelation test: "
        print $ typeOf res
        print res
        F.mapM_ print res
    

    或者,你可以做一个 newtype

    {-# LANGUAGE DeriveFoldable #-}
    
    import Data.Vector as V
    import Statistics.Autocorrelation
    import Data.Typeable
    
    newtype Triple a = Triple (a, a, a) deriving(Foldable)
    
    sampleA = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4]
    
    main = do
        let res = autocorrelation $ V.fromList sampleA
        putStr "Type of result of autocorrelation test: "
        print $ typeOf res
        print res
        Prelude.mapM_ print $ Triple res
    
        3
  •  2
  •   willeM_ Van Onsem    6 年前

    我们可以利用 lens [Hackage]

    import Control.Lens(toListOf, each)
    import qualified Data.Vector as V
    import Statistics.Autocorrelation
    
    sampleA = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4]
    
    main :: IO ()
    main = mapM_ print (toListOf each (autocorrelation (V.fromList sampleA)))

    但最好是像这样进行模式匹配 @DanielWagner 也就是说,从那以后你就更清楚地知道发生了什么。