Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中绘制随机行走_Haskell - Fatal编程技术网

在Haskell中绘制随机行走

在Haskell中绘制随机行走,haskell,Haskell,我正试图在哈斯凯尔画一幅随机漫步图。 我用getStdGen来计算随机数。 我使用图表。易于绘图。 我是haskell的一个平民,我无法理解我遇到的编译器错误 import Graphics.Rendering.Chart.Easy import Graphics.Rendering.Chart.Backend.Cairo import System.Random main = toFile def "random_walk.png" $ do layout_title .= "Random

我正试图在哈斯凯尔画一幅随机漫步图。 我用getStdGen来计算随机数。 我使用图表。易于绘图。 我是haskell的一个平民,我无法理解我遇到的编译器错误

import Graphics.Rendering.Chart.Easy
import Graphics.Rendering.Chart.Backend.Cairo
import System.Random

main = toFile def "random_walk.png" $ do
 layout_title .= "Random Walk"
 setColors [opaque blue, opaque red]
 g <- getStdGen
 plot (line "random walk" [ take 100 $ walk (0,0) ( randoms g :: [Float])])

walk :: (Float, Float) -> [Float] -> [(Float, Float)]
walk (x,y) (dx:dy:list) = (x+dx,y+dy):(walk (x+dx,y+dy) list)
import Graphics.Rendering.Chart.Easy
导入Graphics.Rendering.Chart.Backend.Cairo
导入系统。随机
main=toFile def“random_walk.png”$do
布局标题=“随机漫步”
setColors[不透明蓝色,不透明红色]
g[Float]->[(Float,Float)]
走(x,y)(dx:dy:list)=(x+dx,y+dy):(走(x+dx,y+dy)list)
错误是:

[1 of 1] Compiling Main             ( simple.hs, interpreted )

simple.hs:8:7: error:
    * Couldn't match type `IO'
                     with `Control.Monad.Trans.State.Lazy.StateT
                             (Layout Float Float) (Control.Monad.Trans.State.Lazy.State CState)'
      Expected type: Control.Monad.Trans.State.Lazy.StateT
                       (Layout Float Float)
                       (Control.Monad.Trans.State.Lazy.State CState)
                       StdGen
        Actual type: IO StdGen
    * In a stmt of a 'do' block: g <- getStdGen
      In the second argument of `($)', namely
        `do layout_title .= "Random Walk"
            setColors [opaque blue, opaque red]
            g <- getStdGen
            plot
              (line
                 "random walk" [take 100 $ walk (0, 0) (randoms g :: [Float])])'
      In the expression:
        toFile def "random_walk.png"
          $ do layout_title .= "Random Walk"
               setColors [opaque blue, opaque red]
               g <- getStdGen
               plot
                 (line
                    "random walk" [take 100 $ walk (0, 0) (randoms g :: [Float])])
  |
8 |  g <- getStdGen
  |       ^^^^^^^^^
Failed, no modules loaded.
[1/1]编译Main(simple.hs,已解释)
简单。hs:8:7:错误:
*无法匹配“IO”类型
使用`Control.Monad.Trans.State.Lazy.StateT
(布局浮动)(Control.Monad.Trans.State.Lazy.State CState)'
预期类型:Control.Monad.Trans.State.Lazy.StateT
(布局浮动)
(Control.Monad.Trans.State.Lazy.State CState)
斯特根
实际类型:IO StdGen

*在'do'块的stmt:g中,问题在于
toFile
的第三个参数是特殊
EC
单子中的动作。此monad不能执行IO,因此不能在其do块中包含像
getStdGen
这样的IO操作

相反,使用单独的外部IO do块获取所需的随机数流作为纯值,然后可以在内部EC do块中自由使用它,如下所示:

main :: IO ()
main = do
  -- this is do-block for the IO monad
  nums <- randomRs (-1,1) <$> getStdGen
  toFile def "random_walk.png" $ do
    -- this is the do-block for the EC monad
    layout_title .= "Random Walk"
    setColors [opaque blue, opaque red]
    plot (line "random walk" [ take 100 $ walk (0,0) nums ])

walk :: (Float, Float) -> [Float] -> [(Float, Float)]
walk (x,y) (dx:dy:list) = (x+dx,y+dy):(walk (x+dx,y+dy) list)
main::IO()
main=do
--这是IO单子的do块
nums[Float]->[(Float,Float)]
走(x,y)(dx:dy:list)=(x+dx,y+dy):(走(x+dx,y+dy)list)

非常感谢,这对我帮助很大:)