私はパーティーに遅刻していることに気づきましたが、あなたはここで2つの理論的な答えを持っているので、噛むための実用的な代替手段を提供したかったのです。私はこれに相対的なHaskell noobとして来ていますが、彼は現在、私が現在取り組んでいるプロジェクトのためにArrowsの主題を通して強制的に行進しました。
まず、Haskellのほとんどの問題をArrowsに手を伸ばさずに生産的に解決できます。いくつかの有名なHaskellerは、実際にそれらを好まないため、使用していません(詳細については、こちら、こちら、およびこちらをご覧ください)。あなたが自分に「ねえ、私はこれらを必要としない」と言っているなら、あなたは本当に正しいかもしれないことを理解してください。
Arrowsについて最初に学んだときに最もイライラさせられたのは、このテーマに関するチュートリアルが回路の類推のために必然的に到達した方法でした。少なくとも砂糖の種類であるArrowコードを見ると、ハードウェア定義言語ほどではありません。入力は右側に並び、出力は左側に並び、それらをすべて正しく配線しないと、単に発火しません。私は自分自身に考えました:本当に?これは私たちが終わった場所ですか?銅線とはんだで構成されるほど完全に高レベルの言語を作成しましたか?
私が判断できた限り、これに対する正しい答えは次のとおりです。実際、はい。Arrowsの現在のキラーユースケースはFRPです(Yampa、ゲーム、音楽、リアクティブシステム全般を考えてください)。FRPが直面している問題は、他のすべての同期メッセージングシステムが直面している問題とほぼ同じです。つまり、関連情報を漏らしたり漏れを引き起こしたりすることなく、入力の連続ストリームを出力の連続ストリームに配線する方法です。ストリームをリストとしてモデル化できます-最近のいくつかのFRPシステムはこのアプローチを使用していますが、入力が多い場合、リストを管理するのはほとんど不可能になります。あなたは現在から自分を隔離する必要があります。
FRPシステムでArrowsが許可しているのは、関数をネットワークに構成すると同時に、それらの関数によって渡される基になる値への参照を完全に抽象化することです。FPを初めて使用する場合、これは最初は混乱する可能性があり、次にその意味を吸収したときに驚くべきことがあります。関数を抽象化できるという考えと[(*), (+), (-)]
、typeのようにリストを理解する方法を吸収したのはごく最近のことです[(a -> a -> a)]
。Arrowsを使用すると、抽象化を1レイヤーだけ進めることができます。
抽象化するこの追加機能には、それ自体の危険が伴います。1つには、GHCを、型の仮定を何にすべきかわからないコーナーケースに追い込む可能性があります。型レベルで考える準備をする必要があります。これは、種類やRankNTypesなどのトピックについて学ぶ絶好の機会です。
私が「愚かなアロースタント」と呼ぶものの例もいくつかあります。コーダーは、タプルできちんとしたトリックを披露したいという理由で、アローコンビネーターに手を伸ばします。(狂気への私自身のささいな貢献はここにあります。)あなたが野生でそれに出くわすとき、そのようなホットドッギングを無視してください。
注:上記のように、私は比較的初心者です。上記の誤解を公布した場合は、お気軽に修正してください。