/ / elmのコンパイルはJavaのチェック例外とどう違うのですか? - java、elm、checked-exceptions

elmのコンパイルはJavaのチェック例外とどのように違いますか? - java、elm、checked-exceptions

elmの主張 ゼロランタイム例外 その主要なセールスポイントの1つです( 公式ウェブサイト)、

しかし、あなたがそれについて考えるのを止めれば、あなたはゼロで分けたり、メモリを使い果たすことを止めることはできません。

どのような elm コンパイラは基本的に、例外につながる可能性のあるすべてのパスをカバーするよう強制しています。

例えば:

import String exposing (toInt)
toIntOrZero s = case toInt s of
Err e -> 0
Ok val -> val

しかし、これは 悪名高い の「チェック例外」機能 java

public static Integer toIntOrZero(String s) {
try { return Integer.valueOf(s); }
catch (NumberFormatException e) { return 0; }
}

私は何の主張も聞いたことがない java ゼロランタイム例外言語です。

回答:

回答№1は5

本質的に誇大広告を売っているものに巻き込まれすぎてはいけません。 もちろん どのコンパイラでも完全に排除することができないエラーのクラスがあります。

そういうわけで、私はいつもこれらを取ってきたJavascriptでフロントエンドアプリケーションを開発する代わりにElmが作成されました.Javascriptは、例外がたくさんあり、ちょうどその一部です。あなたのアプリで基本的な健全性テストを実行する場合、あなたはおそらく、 勝った "t これまで実行時の例外があります 生産中.

Elmは、いくつかの点で例外の可能性を大幅に低減します。

  1. 言語の中に投げられる例外の概念はありません。 Debug.crashその名前が意味するように、実際には不完全な論理パスをデバッグしてスタブアウトするためにのみ使用する必要があります。

スロー可能な例外は存在しないので、ハンドリングの問題は、 Result そして Maybe.

これは、Javaの例外をチェックしましたが、概念的には私とはまったく違う感じがしました。例外は濫用されています。あなたはJavaの例を挙げています。 Integer.valueOf() それはintを返すつもりだが、もしあなたが何か他のものを渡すと、スタックを展開し、うまくいくらかの関数がそれをキャッチするまでバブルアップします。これは私にとって非常に面倒です。確かに、チェック例外はウィンドウの失敗伝播を減らすのに役立ちますが、基本的な事実は例外がビジネスロジックの間違ったツールだということです。

例外をスローする代わりに、クラスに類似したクラスを持つこともできます Result そして Maybe エルムのタイプ、それはほぼJavaの初期段階ではきれいにすることは不可能であり、ジェネリックスであっても、そのような型を記述することは、Elm型の単純さよりも面倒でエラーが発生しやすく、Elmの閉鎖型システムのために、

  1. 非網羅的なパターンマッチによりコンパイルに失敗する

JavaとJavascriptでは、持っている方法がありませんタイプシステムが許可していないため、徹底したパターンマッチチェック。確かに、Typescriptはいくつかの機能を導入しましたが、オプトインする必要があります。 Elmでは、すべてのケースを明示的に処理する必要があります。確かに、エルム氏はすべてのケースステートメントをキャッチオールで終わらせることで網羅的なパターンマッチングを廃止することができると主張できます _しかし、それはちょうど言語。これらの小切手はあなたを助けるためのものであり、私はElmでのエラーチェックにオプトインすることはできません。デフォルトではそこにあります。

  1. 不変性

不変性は、潜在的な種類のエラーを回避します。

  1. Elmアーキテクチャは、JavascriptとElmの間の明確な分離を提供します

ElmはJavascriptにコンパイルしますが、Elmアーキテクチャは、Elmによって書かれた純粋なコードからJavascriptのすべての厄介なビットを守るためのきれいなバリアを提供します。 Javascriptで発生する可能性のある例外は、I / OエラーがElmに優しい、例外のないタイプに常に変換されるように、そのバリアによって処理される必要があります。

結局のところ、実行時の例外はまだ可能です(ケースインポイント: 次のタグ付きエルムの質問 よく知られた実行時例外が発生した再帰的なJson Decoderの定義で)、私は誰かがElmで例外を取ることは不可能だと言っていることを聞いたときは少し時間をかけています。事実は例外が可能ですが、日々のJavascript開発では 基本的に エルムでは不可能。


回答№2については4

コメント執筆者が指摘したように、Javaでは例外がチェックされていないため、ランタイムエラー 行う 起こる。エルムはまた、ゼロによる除算のようなチェックされていない例外を持っていますが、実際に最もよく見られる例外を取り除きます。そしてチャドの答えが述べるように、エルムは Maybe/Result 実際には、Javaのチェック例外とはかなり異なる動作をします。経験豊かなElmプログラマは、 toIntOrZero (そうした場合、彼らはおそらく case ... of代わりに好きなものを好む toIntOrZero = String.toInt >> Result.withDefault 0)。

複数の操作を Result.map, Result.andThen、などは非常に表現力豊かな方法を提供しますプログラマが雑草を深く掘り下げることなく、エラーケースを処理します。例えば、IDをIDLに変換し、それが存在しないかもしれないときにデータ構造を見てIDを検証し、そのユーザーに関連するいくつかのプロパティを検証する関数を書く場合、このようなもの:

lookupUser : Int -> Result String User
lookupUser intId = ...

userInGoodStanding : User -> Bool
userInGoodStanding user = ...

isValidId : String -> Bool
isValidId id =
String.toInt id
|> Result.andThen lookupUser
|> Result.map userInGoodStanding
|> Result.withDefault False

これは、 "IDをintに変換してからlookあなたのマイレージは異なるかもしれませんが、それに慣れたら、私(そして多くのエルムのプログラマー、私は思っています!)これは本当にエラーに強くコードを書く良い方法です。