なぜダイアライザーはこの悪いタイプを検出しないのですか?

sgrove

この場合、Dialyzerの動作はかなり奇妙で、理解しやすいものは何も見つかりませんでした。

これはエラーではありません:

defmodule Blog.UserResolver do
  @type one_user :: ( {:error, String.t} )

  @spec find(%{id: String.t}, any()) :: one_user

  def find(%{id: id}, _info) do
    age = :rand.uniform(99)
    if (age < 100) do
      # This doesn't trigger a type error, even though it's wrong
      {:ok, %{email: "[email protected]", name: "Deedub"}}      
    else 
    {:error, "Age isn't in the right range"}
    end
  end
end

可能なリターンブランチの1つが、タイプシグネチャと完全に一致しないことに注意してください

ただし、これにはエラーがあります。

defmodule Blog.UserResolver do
  @type one_user :: ( {:error, String.t} )

  @spec find(%{id: String.t}, any()) :: one_user

  # Throws an error since no return path matches the type spec
  def find(%{id: id}, _info) do
    age = :rand.uniform(99)
    if (age < 100) do
      {:ok, %{email: "[email protected]", name: "Deedub"}}      
    else 
     10
    end
  end
end

この場合、可能なブランチいずれもtypespecに一致せず、dialyzerは次のエラーメッセージを表示します。

web/blog/user_resolver.ex:4: Invalid type specification for function 'Elixir.Blog.UserResolver':find/2. The success typing is (#{'id':=_, _=>_},_) -> 10 | {'ok',#{'email':=<<_:64>>, 'name':=<<_:48>>}}

私が理解していない部分は、ダイアライザーがブランチが返す可能性のある2つの異なるタイプを明確に認識することです((#{'id':=_, _=>_},_) -> 10 | {'ok',#{'email':=<<_:64>>, 'name':=<<_:48>>})。したがって、推論の問題ではありません。では、なぜブランチの1つがタイプ仕様に準拠していないことを認識しないのですか(ブランチの1つだけが準拠していれば幸いですが、これは私が望んでいることではありません)

7スタッド

Dogbertが提供しLearnYouリンクから、次のdialyzerようになります。

クラッシュを保証するタイプエラーについてのみ文句を言います。

最初の例では、年齢が常に100以上の場合、関数は宣言された型を返します。2番目の例では、関数が宣言された型を返す方法はありません。

dialyzer一連の制約方程式を作成します。これらの方程式に解決策があれば、ダイアライザーは文句を言いません。Erlangは動的に型付けされた言語として作成されました。dialyzer事後に誰かが書いたプログラムにすぎません。彼らが熟考し、議論し、理論化したと確信している理由から、ダイアライザーの設計者はその機能を選択しました。

可能であれば、より厳密な型チェッカーを探しています。

今のところ不可能:

Erlang型システム

より精巧な型システムを持たない理由は、Erlangの発明者の誰もがそれを書く方法を知らなかったので、それが成し遂げられなかったからです。静的型システムの利点は、エラーを実行時ではなくコンパイル時に予測できるため、障害を早期に検出して低コストで修正できることです。多くの人がErlang用の静的型システムを構築しようとしました。残念ながら、Erlangが発明されたときに行われた設計上の決定により、ホットコードのロードでは本質的に困難であるため、包括的な型システムを作成できるプロジェクトはありませんでした。多くの型システムの炎上戦争の1つでJoeArmstrongを引用すると、「それは「簡単」であるはずです。実際、数週間のプログラミングで、言語の95%を処理する型システムを作成できます。

「ErlangProgramming(Francesco Cesarini&SimonThompson)」より。

test suite動的に型指定されたプログラムを制御下に置くには、Aが必要です。ElixirはErlangの単なるRubifiedバージョンです。Rubyも動的に型付けされた言語ですが、ダイアライザーはありません。Rubyが持っているのはテストだけです。テストスイートを使用して、コンパイラではなく、コンピュータプログラミング言語のワイルドウェストを管理下に置きます。静的に型付けされた言語が必要な場合は、RubifiedバージョンのErlangは最適ではありませんでした。Haskellを参照してください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

このループがnullポインタを検出しないのはなぜですか?

分類Dev

Elasticsearchがカスタムメイドのアナライザーを検出しないのはなぜですか?

分類Dev

タイプケースが悪いのはなぜですか?

分類Dev

DRFのシリアライザーがPositiveSmallIntegerFieldを検証しないのはなぜですか?

分類Dev

なぜオラクルオプティマイザはこのケースを排除しないのですか?

分類Dev

このクラスをインスタンス化したときに配列プロパティが検出されないのはなぜですか?

分類Dev

アンチウイルスは、悪意のないコードを検出しないことをどのように知っていますか?

分類Dev

phpがpdfmimeタイプ(wkhtmltopdf)を正しく検出しないのはなぜですか?

分類Dev

React-Djangoアプリが静的ファイルを検出しないのはなぜですか?

分類Dev

引数のないタイプ アイテムのインティライザーを呼び出すことはできません

分類Dev

`fatrace`が特定のオープンイベント(udisks / dev / sda)を検出しないのはなぜですか?

分類Dev

符号なしタイプのアンダーフロー警告がないのはなぜですか?

分類Dev

この珍しいObjective-Cデザインパターンが悪い考えであるのはなぜですか?

分類Dev

Newtonsoftデシリアライザーがスマートゲッターをデシリアライズしないのはなぜですか?

分類Dev

Newtonsoftデシリアライザーがスマートゲッターをデシリアライズしないのはなぜですか?

分類Dev

なぜプライベートフィールドをあざけるのは悪いのですか?

分類Dev

アンチウイルススキャナーが悪意のあるものを何も検出しない場合に、ウイルスがないことを確認するにはどうすればよいですか?(Windows 7)

分類Dev

このOCamlファンクターが構造タイプを認識しないのはなぜですか?

分類Dev

クライアント側のoauthが悪いのはなぜですか?

分類Dev

なぜAngularは、プロバイダーのuseFactoryで関数にパラメーターを渡すことができないのですか?

分類Dev

GITがファイルモード644と664の違いを検出しないのはなぜですか?

分類Dev

constなしでCスタイルの文字列を宣言するのは悪いことですか?もしそうなら、なぜですか?

分類Dev

constなしでCスタイルの文字列を宣言するのは悪いことですか?もしそうなら、なぜですか?

分類Dev

クラスの参照または一意のポインタメンバーを使用するのはなぜ悪いことですか?

分類Dev

Ubuntuインストーラーがインストール中にハードドライブを検出しないのはなぜですか?

分類Dev

Ubuntuインストーラーがインストール中にハードドライブを検出しないのはなぜですか?

分類Dev

C ++コアガイドラインPer.4で、なぜ悪い例がより速くなることを意図しているのですか?

分類Dev

このタイプのガードがこの3項式で機能しないのはなぜですか?

分類Dev

このツリータイプの `Ord`の実装を導出することは可能ですか?そうでない場合は、なぜですか?

Related 関連記事

  1. 1

    このループがnullポインタを検出しないのはなぜですか?

  2. 2

    Elasticsearchがカスタムメイドのアナライザーを検出しないのはなぜですか?

  3. 3

    タイプケースが悪いのはなぜですか?

  4. 4

    DRFのシリアライザーがPositiveSmallIntegerFieldを検証しないのはなぜですか?

  5. 5

    なぜオラクルオプティマイザはこのケースを排除しないのですか?

  6. 6

    このクラスをインスタンス化したときに配列プロパティが検出されないのはなぜですか?

  7. 7

    アンチウイルスは、悪意のないコードを検出しないことをどのように知っていますか?

  8. 8

    phpがpdfmimeタイプ(wkhtmltopdf)を正しく検出しないのはなぜですか?

  9. 9

    React-Djangoアプリが静的ファイルを検出しないのはなぜですか?

  10. 10

    引数のないタイプ アイテムのインティライザーを呼び出すことはできません

  11. 11

    `fatrace`が特定のオープンイベント(udisks / dev / sda)を検出しないのはなぜですか?

  12. 12

    符号なしタイプのアンダーフロー警告がないのはなぜですか?

  13. 13

    この珍しいObjective-Cデザインパターンが悪い考えであるのはなぜですか?

  14. 14

    Newtonsoftデシリアライザーがスマートゲッターをデシリアライズしないのはなぜですか?

  15. 15

    Newtonsoftデシリアライザーがスマートゲッターをデシリアライズしないのはなぜですか?

  16. 16

    なぜプライベートフィールドをあざけるのは悪いのですか?

  17. 17

    アンチウイルススキャナーが悪意のあるものを何も検出しない場合に、ウイルスがないことを確認するにはどうすればよいですか?(Windows 7)

  18. 18

    このOCamlファンクターが構造タイプを認識しないのはなぜですか?

  19. 19

    クライアント側のoauthが悪いのはなぜですか?

  20. 20

    なぜAngularは、プロバイダーのuseFactoryで関数にパラメーターを渡すことができないのですか?

  21. 21

    GITがファイルモード644と664の違いを検出しないのはなぜですか?

  22. 22

    constなしでCスタイルの文字列を宣言するのは悪いことですか?もしそうなら、なぜですか?

  23. 23

    constなしでCスタイルの文字列を宣言するのは悪いことですか?もしそうなら、なぜですか?

  24. 24

    クラスの参照または一意のポインタメンバーを使用するのはなぜ悪いことですか?

  25. 25

    Ubuntuインストーラーがインストール中にハードドライブを検出しないのはなぜですか?

  26. 26

    Ubuntuインストーラーがインストール中にハードドライブを検出しないのはなぜですか?

  27. 27

    C ++コアガイドラインPer.4で、なぜ悪い例がより速くなることを意図しているのですか?

  28. 28

    このタイプのガードがこの3項式で機能しないのはなぜですか?

  29. 29

    このツリータイプの `Ord`の実装を導出することは可能ですか?そうでない場合は、なぜですか?

ホットタグ

アーカイブ