haskell - 为什么 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
它lin
在TextOpts
'textFont
字段中使用。TextOpts
但是, 'textFont
字段的预期与 . 的定义之间似乎存在类型不匹配lin
。
TextOpts
' 定义表明该textFont
字段具有类型textFont :: PreparedFont n
,而 的定义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
toTextOpts
的textFont
字段?
解决方案
从 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
推荐阅读
- r - 使用基本图系统在 R 中绘制时间序列
- javascript - 嵌套的 v-for 循环 VueJS 中的两个不同对象
- python - Python中嵌套sort(),同时进行多属性函数排序
- logic - 计算循环运行的次数
- azure-devops - 我在 DevOps 生产部署方面遇到问题 - 无法编辑或替换部署
- javascript - 说话人识别 API 识别配置文件 - 创建注册:如何从网页以指定格式录制音频?
- python - 调用 ScreenManager.get_screen() 函数时出现意外的 TypeError
- d - minElement 模板容器如何工作?
- sql - 复制超过 1000 行的 SQL 表的干净方法是什么?
- java - 调用 notifyAll() 后线程未唤醒