首页 > 解决方案 > 为什么 Haskell 的 SVGFonts 库中的这个示例无法编译?

问题描述

使用 Haskell 的SVGFonts库,我正在尝试使用该textSVG_函数来生成图表。这是我要遵循的示例,该示例通过以下定义包含在代码中textSVG_

text'' t = (textSVG_ (TextOpts lin INSIDE_H KERN True 1 1) t)
           # fc blue # lc blue # bg lightgrey # fillRule EvenOdd # showOrigin

linTextOpts'textFont字段中使用。TextOpts但是, 'textFont字段的预期与 . 的定义之间似乎存在类型不匹配linTextOpts' 定义表明该textFont字段具有类型textFont :: PreparedFont n,而 的定义lin表明它具有类型lin :: (Read n, RealFloat n) => IO (PreparedFont n)

为什么IOlin?当我尝试编译它时,它会引发类型不匹配。

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 ntoTextOptstextFont字段?

标签: haskell

解决方案


从 commit 开始,他们的文档似乎已经过时并且不再匹配他们的代码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

或者你可以作弊,就像他们在他们的Default例子中所做的那样:

text'' t = (textSVG_ (TextOpts (unsafePerformIO lin) INSIDE_H KERN True 1 1) t)
           # fc blue # lc blue # bg lightgrey # fillRule EvenOdd # showOrigin

推荐阅读