如何解决Haskell用非常简单的记录语法麻烦
尽管是Haskell新手,但我以前使用过记录。它们易于使用。但是现在,当我希望从记录中提取一些数据时,我遇到了“发现漏洞”错误。令人反感的代码是:
let theSchemaId = _schemaId schema
因此定义记录的位置:
data Schema = Schema
{ _schemaId :: !SchemaId,[ other fields ... ]
}
对我来说,这似乎很简单,类似于我以前使用的记录。但是,当运行上面的代码行时,下面出现以下错误。所有进口均已到位。关于其起因有任何想法吗?
错误:
src/master/haskell-service/src/Handler/Strategy/Components/View.hs:695:34: error:
src/master/haskell-service/src/Handler/Strategy/Components/View.hs:695:34: error:
• Found hole: _schemaId :: Schema -> SchemaId
Or perhaps ‘_schemaId’ is mis-spelled,or not in scope
• In the expression: _schemaId
In the expression: _schemaId schema
In a pattern binding: theSchemaId :: SchemaId = _schemaId schema
• Relevant bindings include
theSchemaId :: SchemaId
解决方法
毫无疑问,Haskell代码中无法识别的标识符会生成错误消息。例如,程序:
foo = noSuchIdentifier 10
生成错误消息:
HolyFields.hs:5:7-22: error:
Variable not in scope: noSuchIdentifier :: Integer -> t
以下划线开头的无法识别的标识符 也会生成错误消息,但是由于标识符被视为typed holes,因此消息有所不同。例如,程序:
bar = _underscoredIdentifier 10
生成错误消息:
HolyFields.hs:1:7-28: error:
• Found hole: _underscoredIdentifier :: Integer -> t
Where: ‘t’ is a rigid type variable bound by
the inferred type of bar :: t
at HolyFields.hs:1:1-31
Or perhaps ‘_underscoredIdentifier’ is mis-spelled,or not in scope
但是,如果知道标识符,则不会出现错误是否以下划线开头。以下程序可以正常编译:
_noProblem = (*2)
quux = _noProblem 10
对于名称字段中出现的标识符,情况也是如此。
因此,您看到的问题是,即使您认为字段_schemaId
在使用时就在范围内,但事实并非如此。您也许忘记了加载包含其定义的模块,或者该模块具有将其排除的导出列表。
尤其要注意,如果仅导出Schema
,如下所示:
module MyModule (Schema) where
data Schema = ...
这不会导出Schema
的构造函数或字段函数。您需要改写:
module MyModule (Schema(..)) where
data Schema = ...
为了使_schemaId
进入导入模块范围。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。