无法理解渐变中的警告

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

据我了解,这段代码(来自一个新项目)有几个问题:

  1. 警告:代码块包含未使用的文字“\n”(删除文字或将其分配给 _ 以避免警告)
  2. 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 真的让我失望。