无法理解渐变中的警告
Cannot understand warnings in Gradient
背景
我现在正在尝试渐进式类型检查,因此我尝试 Gradient。在我看来,这是 Dialyzer 的替代品。
问题
因此,在我的第一个代码片段中,我从一个纯函数开始:
defmodule TipCalculator do
@spec getTipPercentage(List[String.t()]) :: non_neg_integer
def getTipPercentage(names) do
names_size = length(names)
cond do
names_size > 5 -> 20
names_size > 0 -> 10
true -> 0
end
end
end
在我看来,我的类型检查相当可靠。
不过Gradient好像有不同意见:
===> Analyzing applications...
===> Compiling gradualizer
src/gradualizer.erl:45:2: Warning: opaque type top() is underspecified and therefore meaningless
src/typechecker.erl:3234:1: Warning: function type_check_cons_in/4 is unused
src/typechecker.erl:3247:1: Warning: function type_check_cons_union/4 is unused
src/typechecker.erl:4612:1: Warning: function verbose/3 is unused
src/typechecker.erl:4870:1: Warning: function gen_partition/3 is unused
src/typechecker.erl:4872:1: Warning: function paux/3 is unused
==> gradient
Compiling 14 files (.ex)
Generated gradient app
==> grokking_fp
Compiling 1 file (.ex)
warning: code block contains unused literal "\n" (remove the literal or assign it to _ to avoid warnings)
lib/tip_calculator.ex: TipCalculator
Generated grokking_fp app
Typechecking files...
lib/tip_calculator.ex: Undefined remote type Access:get/2 on line 0
据我了解,这段代码(来自一个新项目)有几个问题:
- 警告:代码块包含未使用的文字“\n”(删除文字或将其分配给 _ 以避免警告)
- lib/tip_calculator.ex: 未定义的远程类型 Access:get/2 on line 0
第一个听起来像是警告信条(或 linter)给我的。所以我不太确定如何处理它。我期待一个只进行类型检查的工具(也许我错了?)。
第二个,我不知道。
问题
我做错了什么?
回答
我有点困惑,正确的输入是 [String.t]
而不是 List[String.t]
。
不过我要说的是:
lib/tip_calculator.ex: Undefined remote type Access:get/2 on line 0
(对我而言)这不是一条描述性很强的错误消息。
然而,考虑到替代(dialzyer)消息也好不到哪儿去:
lib/tip_calculator.ex:8:unknown_type
Unknown type: Access.get/2.
不过我要说的是,行号对找到问题提供了不可思议的帮助。
渐变线 0 真的让我失望。
背景
我现在正在尝试渐进式类型检查,因此我尝试 Gradient。在我看来,这是 Dialyzer 的替代品。
问题
因此,在我的第一个代码片段中,我从一个纯函数开始:
defmodule TipCalculator do
@spec getTipPercentage(List[String.t()]) :: non_neg_integer
def getTipPercentage(names) do
names_size = length(names)
cond do
names_size > 5 -> 20
names_size > 0 -> 10
true -> 0
end
end
end
在我看来,我的类型检查相当可靠。 不过Gradient好像有不同意见:
===> Analyzing applications...
===> Compiling gradualizer
src/gradualizer.erl:45:2: Warning: opaque type top() is underspecified and therefore meaningless
src/typechecker.erl:3234:1: Warning: function type_check_cons_in/4 is unused
src/typechecker.erl:3247:1: Warning: function type_check_cons_union/4 is unused
src/typechecker.erl:4612:1: Warning: function verbose/3 is unused
src/typechecker.erl:4870:1: Warning: function gen_partition/3 is unused
src/typechecker.erl:4872:1: Warning: function paux/3 is unused
==> gradient
Compiling 14 files (.ex)
Generated gradient app
==> grokking_fp
Compiling 1 file (.ex)
warning: code block contains unused literal "\n" (remove the literal or assign it to _ to avoid warnings)
lib/tip_calculator.ex: TipCalculator
Generated grokking_fp app
Typechecking files...
lib/tip_calculator.ex: Undefined remote type Access:get/2 on line 0
据我了解,这段代码(来自一个新项目)有几个问题:
- 警告:代码块包含未使用的文字“\n”(删除文字或将其分配给 _ 以避免警告)
- lib/tip_calculator.ex: 未定义的远程类型 Access:get/2 on line 0
第一个听起来像是警告信条(或 linter)给我的。所以我不太确定如何处理它。我期待一个只进行类型检查的工具(也许我错了?)。
第二个,我不知道。
问题
我做错了什么?
回答
我有点困惑,正确的输入是 [String.t]
而不是 List[String.t]
。
不过我要说的是:
lib/tip_calculator.ex: Undefined remote type Access:get/2 on line 0
(对我而言)这不是一条描述性很强的错误消息。 然而,考虑到替代(dialzyer)消息也好不到哪儿去:
lib/tip_calculator.ex:8:unknown_type
Unknown type: Access.get/2.
不过我要说的是,行号对找到问题提供了不可思议的帮助。 渐变线 0 真的让我失望。