Haskell では、関数の型によって、その関数が何をするのか、さらに重要なことに、何をしないのかが正確にわかります。これにより、Haskell コードの推論が容易になります。
たとえば、次のタイプの関数があるとします。
f :: Int -> Int
Int
as input を取りInt
as 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 コードを読みやすく理解しやすくなります。そのため、型が許可する以上のことを理解する必要はありません。