使GHC忽略非范围内的错误

时间:2015-03-23 12:54:34

标签: haskell ghc

我正在构建一个模块,每次我编写一个函数时,它都会调用其他几个尚不存在的函数。显然它们最终会存在,但在我编写完代码之前能够进行语法检查会很不错。

我是否可以使用一些标志组合来使GHC发出警告而不是错误#34;名称foo不在范围内"?

(如果GHC可以为不存在的名称选择类型签名,并且确认程序仍然可以进行类型检查,那将是很好的。这是几乎"类型漏洞"功能的作用 - 但要使用它,您仍然需要手动定义所有标识符。)

2 个答案:

答案 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 :: sf :: s -> c的上下文。类型检查器可以在大多数时间推断这些类型(这是TypedHoles的点),你可以给它们命名。如果需要,您可以使用_作为符号名称的第一个字符来定义所有功能,然后使用编辑器将_(.+)\b替换为\1。如果你想解决使用_name作为记录字段的镜头惯例,那么只需在你的洞名称上加上2个下划线。

但这仍然会使您的代码无法编译,但如果将其与-fdefer-type-errors结合使用,则会将其报告为警告,从而允许在运行时发生类型错误。

答案 1 :(得分:3)

我通常的做法是将缺失的函数或值定义为undefined。它很容易定义,并为您提供方便的标记,以确定尚未定义相关功能。

我知道这不能回答OP的问题,因为这些功能仍然必须手工定义,但我认为无论如何它都可能有用。