我试图了解如何在Haskell中使用Diagrams库。
这是我尝试制作一个简单的gif动画,它在两个半径为1和2的圆圈之间切换。我试图模仿我所看到的
这是代码,我试过了。
{-# LANGUAGE NoMonomorphismRestriction #-}
import Diagrams.Backend.SVG.CmdLine
import Diagrams.Prelude
delays = take 2 (repeat 3)
gif :: [(Diagram B, Int)]
gif = zip [circle 1, circle 2] delays
main = mainWith $ gif
但这无法编译!我得到的错误是
[1 of 1] Compiling Main ( maze.hs, maze.o )
maze.hs:10:8:
No instance for (Diagrams.Backend.CmdLine.Parseable
(Diagrams.Backend.CmdLine.MainOpts
[(QDiagram B V2 Double Any, Int)]))
arising from a use of ‘mainWith’
In the expression: mainWith
In the expression: mainWith $ gif
In an equation for ‘main’: main = mainWith $ gif
上面的代码我哪里出错了?
答案 0 :(得分:3)
我花了一点时间弄明白,因为错误信息根本不明显,但这是一个后端问题。 The documentation声明cairo后端可以创建GIF动画。但是,您使用的是svg后端(无法理解[(Diagram B, Int)]
是什么。
要解决此问题,请确保已安装diagrams-cairo
软件包,并更改行
import Diagrams.Backend.SVG.CmdLine
到
import Diagrams.Backend.Cairo.CmdLine
答案 1 :(得分:2)
我将解释必要的其他步骤,因为这是在图表中进行动画的第一个搜索结果之一。图表将视口重新调整为每个圆的图像大小,以便circle 1
和circle 2
等效。要解决此问题,您可以将圆圈放在与circle 2
相同大小的不可见方块上。
此外,延迟时间为1/100秒。那么正确的代码就是:
{-# LANGUAGE NoMonomorphismRestriction #-}
import Diagrams.Backend.Cairo.CmdLine
import Diagrams.Prelude
gif :: [(Diagram B, Int)]
gif = map (\x -> (x # lc white <> square 4 # lw none,300)) [circle 1,circle 2]
main = mainWith gif