我正在构建一个模块,每次我编写一个函数时,它都会调用其他几个尚不存在的函数。显然它们最终会存在,但在我编写完代码之前能够进行语法检查会很不错。
我是否可以使用一些标志组合来使GHC发出警告而不是错误#34;名称foo
不在范围内"?
(如果GHC可以为不存在的名称选择类型签名,并且确认程序仍然可以进行类型检查,那将是很好的。这是几乎"类型漏洞"功能的作用 - 但要使用它,您仍然需要手动定义所有标识符。)
答案 0 :(得分:11)
使用名为TypedHoles
:
> let f x = _g . _h x $ x
Found hole ‘_g’ with type: b0 -> c
Where: ‘b0’ is an ambiguous type variable
‘c’ is a rigid type variable bound by
the inferred type of f :: s -> c at <interactive>:2:5
Relevant bindings include
x :: s (bound at <interactive>:2:7)
f :: s -> c (bound at <interactive>:2:5)
In the first argument of ‘(.)’, namely ‘_g’
In the expression: _g . _h x
In the expression: _g . _h x $ x
Found hole ‘_h’ with type: s -> s -> b0
Where: ‘b0’ is an ambiguous type variable
‘s’ is a rigid type variable bound by
the inferred type of f :: s -> c at <interactive>:2:5
Relevant bindings include
x :: s (bound at <interactive>:2:7)
f :: s -> c (bound at <interactive>:2:5)
In the expression: _h
In the second argument of ‘(.)’, namely ‘_h x’
In the expression: _g . _h x
因此,这会为_g :: b0 -> c
和_h :: s -> s -> b0
提供x :: s
和f :: s -> c
的上下文。类型检查器可以在大多数时间推断这些类型(这是TypedHoles
的点),你可以给它们命名。如果需要,您可以使用_
作为符号名称的第一个字符来定义所有功能,然后使用编辑器将_(.+)\b
替换为\1
。如果你想解决使用_name
作为记录字段的镜头惯例,那么只需在你的洞名称上加上2个下划线。
但这仍然会使您的代码无法编译,但如果将其与-fdefer-type-errors
结合使用,则会将其报告为警告,从而允许在运行时发生类型错误。
答案 1 :(得分:3)
我通常的做法是将缺失的函数或值定义为undefined
。它很容易定义,并为您提供方便的标记,以确定尚未定义相关功能。
我知道这不能回答OP的问题,因为这些功能仍然必须手工定义,但我认为无论如何它都可能有用。