我使用Haskell的SVGFonts
库,尝试使用textSVG_
函数来生成图表。这是我要遵循的示例,definition of textSVG_
包含在代码中:
text'' t = (textSVG_ (TextOpts lin INSIDE_H KERN True 1 1) t)
# fc blue # lc blue # bg lightgrey # fillRule EvenOdd # showOrigin
它在lin
'TextOpts
字段中使用textFont
。但是,TextOpts
'textFont
字段所期望的内容与lin
的定义之间似乎存在类型不匹配。
TextOpts
' definition显示textFont
字段具有类型textFont :: PreparedFont n
,而definition of lin
显示其字段类型lin :: (Read n, RealFloat n) => IO (PreparedFont n)
。
为什么IO
中的lin
?尝试编译时会引发类型不匹配。
Couldn't match type `IO
(Graphics.SVGFonts.ReadFont.PreparedFont Double)'
with `(Graphics.SVGFonts.ReadFont.FontData n,
Graphics.SVGFonts.ReadFont.OutlineMap n)'
Expected type: Graphics.SVGFonts.ReadFont.PreparedFont n
Actual type: IO (Graphics.SVGFonts.ReadFont.PreparedFont Double)
如何简单地在PreparedFont n
的{{1}}字段中提供TextOpts
?
答案 0 :(得分:3)
从提交61424cc
开始,他们的文档似乎已经过时并且不再与它们的代码匹配。 (这就是为什么您应该使用doctests的原因,人们!)
lin
仍包裹在IO
中,您不能使用。做类似这样的事情:
do
lin' <- lin
let text'' t = (textSVG_ (TextOpts lin' INSIDE_H KERN True 1 1) t)
# fc blue # lc blue # bg lightgrey # fillRule EvenOdd # showOrigin
如果您没有IO
方便的地方,请使其成为函数参数并稍后获取字体:
text'' font t = (textSVG_ (TextOpts font INSIDE_H KERN True 1 1) t)
# fc blue # lc blue # bg lightgrey # fillRule EvenOdd # showOrigin
或者您也可以作弊,like they do in their Default
instance:
text'' t = (textSVG_ (TextOpts (unsafePerformIO lin) INSIDE_H KERN True 1 1) t)
# fc blue # lc blue # bg lightgrey # fillRule EvenOdd # showOrigin