为什么Haskell的SVGFonts库中的示例无法编译?

时间:2019-12-04 23:57:59

标签: haskell haskell-svgfonts

我使用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

1 个答案:

答案 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