patternsを翻訳してみたsell関数型言語,デザインパターン,翻訳,ElmElmパターンを翻訳しましたElmで使う標準的な設計パターンをまとめた記事を発見しました。(sporto.github.io)そのため、完全になぞったわけではないですが、自分の理解も含めて簡単に翻訳してみました。※正しく理解したい人は原文を読んでもらったほうがいいかと思います。省いたり、自分がわかりやすい表現に直したりしていますので。blindness型が同じで、かつ容易に混同しやすいものに対し、ユニークな型を設定することで混同を防ぐ。2.02022年5月9日追記このパターンを使用すると、後で値をunwrapする必要があるため、その手間をかけてでも混同を避けたい場合に使用するとよい。usageBooleanの曖昧さはコードの意図や情報を導きやすく、結果的に曖昧なロジックになりやすい。Typeで置き換えることで曖昧さを回避する。Economyこのように記述することで、CustomerStatusをダイレクトに記述することができ、bookFlightの意図を明確にできる。Premium例2:booleanをカスタム型に置き換えることで、booleanによる曖昧さを除去し、コンパイラを活用したより安全なコードを実現する。errorsこの場合、submitFormはきっちりした型のデータを受け取ることができる。arguments関数の引数の順番があいまいな場合がある。Bool例えばこの場合だと、通常は「パイプライン」として使うために、比較対象は第2引数にあると考えるかもしれないが、そうではないかもしれない。このようなコードは曖昧で、エラーを引き起こしやすい。そのため、下記のように「レコード」を引数として使用することができる。Boolこのような書き方は「パイプライン」とは相性が良くないが、より正確であり間違えにくい。blindness]]を避けるために、ユニークな型でラッピングするかもしれない。priceこの場合、例えばEurosなどの値が外から入ってくることを止める手段がなく、下記の関数に異なる通貨(ドルやユーロといった)のリストを送ってしまう可能性がある。User型であり、つまりはUnwrapが何度もViewの中で現れることになる。]このようにViewの補助関数でUserを取得しておくことで、ほとんどのViewが書きやすく、テストもしやすくなります。impossibleElmは素晴らしく、表現力のある型システムを持っており、「ありえない状態」を退けることができる。例:Anti-Pattern通常のパターンだと、データが読み込まれている間の「クルクル」を表示するための真偽値がある。これは何を意味するのか?これは、絶対に有り得ない状態なのかもしれない。validate外部データ(ユーザー入力やリモートデータなど)がある場合、そのデータを使用する前に検証するのが一般的なパターンである。Boolこのアプローチの問題点は、実行したあとでも依然として検証していない値を保持していることである。Pattern良い解決方法としては、インプットをParseして、検証済みの型としてreturnすることである。ValidUserこの方法によって、後々まで検証済みの値として保持される。pattern多くの引数を渡さなければならないとき、関数は下記のようになる。msg呼び出し側は下記のようになる。....}この問題は、引数をArgsに追加した場合、関数が呼び出されている箇所を一個ずつすべて変更しなければならないことである。Patternbuilderパターンを使えば、最小限必要な情報の引数だけを用い、必要な場合に引数を最適化すればよい。msgこのモジュールは初期引数を作成する関数と、引数を変更する一連の関数を作成する。一般に、withを接頭辞として用いる。Button.btnこの方法の良いところは、新しい引数が加わっても呼び出し元すべてを変更する必要がないことである。テスト工場としてこのパターンはテストに対して非常に有効である。Userをテストするときなどは、基本的なUserからスタートして、そのあとに最適化した別のパターンを追加すればよい。patternは構成を構築するもの。これは、下記のような純粋なListにも使用可能。]このモジュールは一般的な型を返す一連の関数として定義される。Attributeとして定義することで、関数を構成に使うことができる。elm-uiの中で使用されている。このパターンは不透明な型と一緒に使うのが最適。通常、呼び出し元が返された型(例えば属性)にアクセスできるようにしたいとは思わないからである。このパターンは、すべての引数がオプションである場合に最適です。すべての引数がオプションの場合は、呼び出し側が空のリストを渡すことを避けることができないからです。...のようになってしまう。Attributeとしてひとまとめにできる。これによって、空のリストが呼び出し側から渡されても問題ない。*ここの意味がちょっとわからない。Twitterでご指摘いただき、原文とは変わりますがちょっと修正しました。iteratorすべてがカスタム型による変数になっているリストだと、新しい変数を加えたときにしばしばリストに加えるのをわすれてしまう。hereコンパイラがリマインドしてくれるのはとてもありがたい。非常に多くの変数がある場合は特にそう感じる。コンパイラはcase文においても、変数が追加されていない場合はリマインドしてくれる。matchingである_を使ってはならない。すると、コンパイラは新しい変数が加わったことを見逃してしまう。以上、ざっとなぞってみました。関数型言語で、きちんとこのようにパターンがまとまっているのは見たことがなかったので、とても参考になりました。紹介されている書き方とも通じるところがあるのと、それを関数言語としてどうやって実装するか、ということもわかってとてもよかったです。今回は、元の記事の前半部だけ訳したので、後半も今後訳していきたいですね。