模块框架-TableTypes不起作用

时间:2018-07-31 03:59:19

标签: haskell template-haskell

我是一位熟悉R和python等语言的数据科学家。 我已经尝试学习haskell两个月了。

人们使用了一个模块来处理haskell中的帧,这与其他语言中的常见软件包(R中的tidyverse和python中的pandas)类似。

问题是:提取csv数据类型的常用功能只是返回一条消息错误:

tableTypes "base" "base.csv"

<interactive>:2:1: error:
    • No instance for (Show Language.Haskell.TH.Lib.DecsQ)
        arising from a use of ‘print’
    • In a stmt of an interactive GHCi command: print it

我无法理解此消息的含义,也无法在Google上找到任何答案。有人可以帮我解决吗?

链接到模块:http://hackage.haskell.org/package/Frames

1 个答案:

答案 0 :(得分:1)

您偶然发现了一个涉及Haskell某些高级功能的案例。问题是tableTypes "base" "base.csv"是模板haskell拼接。由于某些原因,几年前ghc进行了修改,以允许顶层的裸表达式作为拼接,而不是要求使用$(expression generating code to splice)的标准拼接语法。

但是裸表达式语法与ghci不兼容。如果您在ghci中输入一个裸表达式,它将尝试评估并打印它(使用一些特殊的规则来生成IO值的表达式)。

当ghci评估tableTypes "base" "base.csv"时,它返回的结果不是Show的实例,因为模板haskell Q环境不可打印。它包含许多功能。

这里有一些选择,具体取决于您实际要执行的操作。您可以在ghci中使用runQ来转储接头生成的AST。那可能不是您想要的。在开发接头时,该工具更有可能比测试使用它们的库有用。

您可以在ghci中启用TemplateHaskell扩展,并实际上以交互方式执行拼接,但这有点麻烦,可以开始工作,而且您最终还是看不到任何东西。

我认为最实用的解决方案是将代码移动到文件中。您可以根据需要从ghci加载该文件-重要的是,在文件上下文中,不再存在语法歧义-这绝对是在编译时求值的接头,而不是用于交互求值的表达式。