我是一位熟悉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上找到任何答案。有人可以帮我解决吗?
答案 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加载该文件-重要的是,在文件上下文中,不再存在语法歧义-这绝对是在编译时求值的接头,而不是用于交互求值的表达式。