1

モナド「パイプ」と「赤いパイプ」についての興味深い記事を読んでいました。関数のパラメーターまたはクラスは、すべてが適合することを確認するためのパイプのタイプであると言っているようです。それからそれは赤いパイプであり続け、常に赤いパイプであり純粋でなければなりません。この部分が分からなかった

「赤いパイプ」が「青いパイプ」にならないのはなぜですか? 赤いパイプを普通のパイプに変えることはできますか? これは純度と何の関係がありますか?これは次のようなものだと考えることができますclass RedPipe: PlainPipe { /* same interface and implementation here*/ }か?

4

2 に答える 2

5

Haskell では、関数の型によって、その関数が何をするのか、さらに重要なことに、何をしないのかが正確にわかります。これにより、Haskell コードの推論が容易になります。

たとえば、次のタイプの関数があるとします。

f :: Int -> Int

Intas input を取りIntas output を生成し、それ以外には何もしないことを私は知っています。重要なのは、副作用がないことを知っていることです。

タイプの関数がある場合:

g :: Double -> State Int Double

...その関数はDouble引数として a を取り、 a を生成する方法を生成しますが、それが何らかの状態Doubleを参照または変更できるようにした場合に限ります。Int

タイプの関数がある場合:

h :: Int -> Maybe String

この関数は を取り、Intを生成するStringか、失敗して何も生成しない可能性があることを知っています。前の 2 つの関数はいずれも を返さなかったことに注意してくださいMaybe。つまり、失敗することはありませんでした。Haskell は、デフォルトでは失敗 (null 許容値) を許可しません。

タイプの関数がある場合:

i :: String -> IO ()

Stringこの関数は を取り、実行して副作用を生成できることを知っています。以前の関数のIO型には がなかったことに注意してください。つまり、これらの関数は副作用を生成できませんでした。Haskell はデフォルトで副作用を許可しません。タイプで明示的にオプトインする必要があります。

これは、関数または値のタイプを見て、それらが使用している機能をすぐに理解できることを意味します。したがって、たとえば、Maybeタイプに a が表示されている場合は、失敗する可能性があることがわかります。そうでない場合は、失敗する可能性がないことがわかります。同様にIO、型に an がある場合、副作用の可能性があることがわかりますがIO、型に no がある場合、副作用の可能性はありません。

主流の言語では、機能を選択的に「オプトイン」するこの機能はありません。すべての機能はデフォルトで常にオンになっています。nullつまり、一部の機能が失敗しなかったことを保証する方法がないため、常にチェックする必要があり、一部の機能が失敗したことを保証する方法がないため、常にテストを実行する必要があります。システムの状態を暗黙のうちに変更しないでください。

Haskell を使用すると、関数の動作を制限して、その「アクセス許可」をより細かく制御できます。これにより、バグなしで大規模なプログラムに簡単にスケーリングできます。また、タイプが全範囲を列挙するため、Haskell コードを読みやすく理解しやすくなります。そのため、型が許可する以上のことを理解する必要はありません。

于 2013-02-25T14:26:51.370 に答える
3

著者は、「赤いパイプ」と「青いパイプ」という用語を比喩として使用しています。私の知る限り、それは広く使われている用語ではありません。彼の記事の要点は、Javaなどの言語によって提供される型安全性が、ある種のプログラマーの間違いを捕らえるのに役立ち、純粋な関数を不純な関数から分離することでさらに捕まえることができるということだと思います。彼の例の1つを使用して:

square :: Double -> Double

この型署名は私にそれを教えてくれます

  1. この機能squareには副作用はありません。データベースをこっそり更新したり、画面に何かを印刷したり、状態データを変更したりすることはありません。(たとえば、JavaまたはCでは、関数とそれが呼び出す関数を読み取るか、ドキュメントに依存して、関数が何をするかを知る必要があります。)

  2. たとえば、特定の値で呼び出すたびに、square 5まったく同じ結果が得られます。これは参照透過性と呼ばれ、この値は決して変更されないことがわかっているため、コンパイラーは最適化を行うことができます。したがって、計算する必要があるのは1回だけです。

于 2013-02-25T14:18:17.567 に答える