Haskell入門_1-1-3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[Program]] > [[Haskell]] > [[Haskell入門]] > 第1章 は...
RIGHT:2022-01-24 (月) 公開
//RIGHT:2022-01-24 (月) 更新
#html{{
<div class="alert alert-info">学習メモ</div>
<table border="0" cellpadding="5"><tr><td valign="top"><a...
}}
#contents
//----------------------------------------
* 1.1.3 純粋性 [#p6a27ea3]
すべての関数が「参照透過性」を持つような関数型プログラミ...
Haskellは、純粋関数型プログラミング言語です。
** 参照透過性 [#r6b894a6]
- [[Haskell入門_1-1-1#referential-transparency]]
>関数に与えた引数が同じなら、必ず結果の値も同じになること...
(参考)参照透過性 - Wikipedia https://w.wiki/4hfs
>参照透過性(さんしょうとうかせい、英: Referential transp...
ある式が参照透過であるとは、その式をその式の値に置き換え...
具体的には変数の値は最初に定義した値と常に同じであり、関...
当然変数に値を割り当てなおす演算である代入 (Assignment) ...
このように参照透過性が成り立っている場合、ある式の値、例...
Haskellでは、
- すべての変数はイミュータブル(変更不能)であり、代入に...
- I/Oを発生させるには「IOモナド」という仕組みを明示的に使...
** 副作用 [#a672e27b]
(参考)副作用 (プログラム) - Wikipedia https://w.wiki/4jC4
>プログラミングにおいて、式の評価による作用には、主たる作...
式は、評価値を得ること(※関数では「引数を受け取り値を返す...
副作用の例としては、グローバル変数や静的ローカル変数の変...
>1. 同じ条件を与えれば必ず同じ結果が得られる
2. 他のいかなる機能の結果にも影響を与えない
このような性質を参照透過性という。
参照透過な機能はそれ自身状態を持たないことで、副作用とは...
>副作用を前提とするノイマン型のアーキテクチャ、つまり、大...
一方、関数型言語では原則として副作用を存在しないものとみ...
>機能が副作用を持たないことの利点は、いかなる状況でも常に...
反面、副作用を持たない言語設計はノイマン型アーキテクチャ...
また、単純な逐次処理を行う場合は状態を中心に命令的な思考...
このためLISPやMLなどは原則として関数型ながら、副作用を許...
(参考)参照透過性 - Wikipedia https://w.wiki/4hfs
>Haskellではモナド (Monad) 型と構文糖衣を利用して参照透過...
>''参照透過性の解釈の変化''
Haskellでは上述のような問題点を解決するための試みがなされ...
参照透過性を満たす関数は引数が同じなら同じ値を返すもので...
わかりやすい例として再帰関数がある。
合計や階乗などは代入を使った反復であっても、与えられた引...
代入をその関数の内部だけにとどめ、結果の取得は変数の内容...
これがSTモナド(State Transformerモナド)である。
Haskellでは関数の「参照透過性」を維持するために、I/Oなど...
それが「モナド」です。
モナドを書きやすくするための糖衣構文として「do構文」など...
** 並列処理 [#j8f3e31c]
参照透過性は関数が状態を持たないことを保証します。
状態を持たない数学的な関数は、並列処理を実現するおに適し...
** HaskellのI/Oの仕組み [#l6fa520f]
関数型プログラミングでは、参照透過性が保証された関数を組...
しかし、それだけでは「副作用」を扱えません。
すなわち、ファイルの読み書き、ディスプレイへの文字表示な...
このようなプログラムとシステムの外界とのやりとりを、I/O(...
I/Oのないプログラムでは、実用的な処理ができません。
現実の課題を解決するには、キーボードからの入力、ファイル...
関数型言語では、どのようにI/Oを実現しているのでしょうか?
*** 非純粋な関数型言語のI/O実現 [#a9d3209f]
評価と当時にI/Oが発生する関数を設けることでI/Oを実現して...
(例)F#の場合(F#はMicrosoft製の関数型言語でOCamlをベー...
#code(F#){{
println "Hi."
}}
という式を評価すると
()
という値が返り、画面に「Hi.」という文字列を表示するI/Oが...
*** HaskellのI/O実現 [#f19caceb]
Haskellでは、F#のように評価と同時にI/Oが発生する関数はあ...
#code(Haskell){{
println "Hi."
}}
という式を評価すると IO ()型の値が返されますが、この時点...
返されたIO ()型の値が、Haskellの処理系によって解釈されて...
Haskellでは、I/Oが行われる式にはすべて「IO」という型が付...
逆に、IOという型が付かない式ではI/Oが発生しないため、参照...
* まとめ [#g4802fc0]
この辺りの説明は、文字通りに受け止めておくけど、いまいち...
後で深掘りして、理解を深めたいです。
とりあえず、今の段階ではそういうもんだと受け流して、先へ...
** 愚痴 [#h4cad87d]
だいたいさ、一度値を決めてしまったら後で変更不能なら、他...
言葉の問題でしかないけど、変更不可能なのに「変数」と名乗...
初心者だと余計な混乱を来たすと思うので、ちょっと不親切だ...
だから、変数に値を「代入」とは言わないで、変数に値を「束...
それなら、最初からHaskellには定数しかなくて変数はない、っ...
細かいことだけど、こういうのもモヤモヤの原因になってる。
まあ、いいけど。
- Haskell 超入門 - Qiita
https://qiita.com/7shi/items/145f1234f8ec2af923ef
>''束縛''
Haskellの変数は後で別の値を再代入することができません。そ...
※ 値が変更できないので変数は存在しないという見解もありま...
- https://twitter.com/igrep/status/753946652352708609
>「Haskellに変数はない!」の本当の意味は「Haskellには『再...
- https://twitter.com/fumieval/status/754142523094773760
>「Haskellに変数はない」というのは完全な誤りで、むしろ再...
それなら「再代入のできる値を保持する構造」を何て呼べばい...
- 変数 (プログラミング) - Wikipedia
https://w.wiki/4XL4
>プログラミングにおける変数(へんすう、英: variable)とは...
変数を用いることで、データを一定期間記憶し必要なときに利...
高水準言語において、変数は記憶装置(メモリ)を抽象化する...
>一人一人の人間が異なる名前によって区別されるように、変数...
これにより、プログラム上で複数のデータを容易に識別・管理...
変数の識別子 (identifier) のことを変数名 (variable name) ...
一般に、変数が表すデータをその変数の値(あたい、英: value...
- variable とは 意味・読み方・表現 | Weblio英和辞書
https://ejje.weblio.jp/content/variable
>変わりやすい、変化しやすい、移り気な、変えられる、変動で...
「variable」という英語には、「可変の」という意味があるか...
命令型言語がこれだけ普及した現代で「変数」の定義を変える...
理路に矛盾があると思うわけよ。
実際、Haskellには変須がなくて定数しかなくても困らないなら...
もうちょっと先に進んでから提言してみるわ。
終了行:
[[Program]] > [[Haskell]] > [[Haskell入門]] > 第1章 は...
RIGHT:2022-01-24 (月) 公開
//RIGHT:2022-01-24 (月) 更新
#html{{
<div class="alert alert-info">学習メモ</div>
<table border="0" cellpadding="5"><tr><td valign="top"><a...
}}
#contents
//----------------------------------------
* 1.1.3 純粋性 [#p6a27ea3]
すべての関数が「参照透過性」を持つような関数型プログラミ...
Haskellは、純粋関数型プログラミング言語です。
** 参照透過性 [#r6b894a6]
- [[Haskell入門_1-1-1#referential-transparency]]
>関数に与えた引数が同じなら、必ず結果の値も同じになること...
(参考)参照透過性 - Wikipedia https://w.wiki/4hfs
>参照透過性(さんしょうとうかせい、英: Referential transp...
ある式が参照透過であるとは、その式をその式の値に置き換え...
具体的には変数の値は最初に定義した値と常に同じであり、関...
当然変数に値を割り当てなおす演算である代入 (Assignment) ...
このように参照透過性が成り立っている場合、ある式の値、例...
Haskellでは、
- すべての変数はイミュータブル(変更不能)であり、代入に...
- I/Oを発生させるには「IOモナド」という仕組みを明示的に使...
** 副作用 [#a672e27b]
(参考)副作用 (プログラム) - Wikipedia https://w.wiki/4jC4
>プログラミングにおいて、式の評価による作用には、主たる作...
式は、評価値を得ること(※関数では「引数を受け取り値を返す...
副作用の例としては、グローバル変数や静的ローカル変数の変...
>1. 同じ条件を与えれば必ず同じ結果が得られる
2. 他のいかなる機能の結果にも影響を与えない
このような性質を参照透過性という。
参照透過な機能はそれ自身状態を持たないことで、副作用とは...
>副作用を前提とするノイマン型のアーキテクチャ、つまり、大...
一方、関数型言語では原則として副作用を存在しないものとみ...
>機能が副作用を持たないことの利点は、いかなる状況でも常に...
反面、副作用を持たない言語設計はノイマン型アーキテクチャ...
また、単純な逐次処理を行う場合は状態を中心に命令的な思考...
このためLISPやMLなどは原則として関数型ながら、副作用を許...
(参考)参照透過性 - Wikipedia https://w.wiki/4hfs
>Haskellではモナド (Monad) 型と構文糖衣を利用して参照透過...
>''参照透過性の解釈の変化''
Haskellでは上述のような問題点を解決するための試みがなされ...
参照透過性を満たす関数は引数が同じなら同じ値を返すもので...
わかりやすい例として再帰関数がある。
合計や階乗などは代入を使った反復であっても、与えられた引...
代入をその関数の内部だけにとどめ、結果の取得は変数の内容...
これがSTモナド(State Transformerモナド)である。
Haskellでは関数の「参照透過性」を維持するために、I/Oなど...
それが「モナド」です。
モナドを書きやすくするための糖衣構文として「do構文」など...
** 並列処理 [#j8f3e31c]
参照透過性は関数が状態を持たないことを保証します。
状態を持たない数学的な関数は、並列処理を実現するおに適し...
** HaskellのI/Oの仕組み [#l6fa520f]
関数型プログラミングでは、参照透過性が保証された関数を組...
しかし、それだけでは「副作用」を扱えません。
すなわち、ファイルの読み書き、ディスプレイへの文字表示な...
このようなプログラムとシステムの外界とのやりとりを、I/O(...
I/Oのないプログラムでは、実用的な処理ができません。
現実の課題を解決するには、キーボードからの入力、ファイル...
関数型言語では、どのようにI/Oを実現しているのでしょうか?
*** 非純粋な関数型言語のI/O実現 [#a9d3209f]
評価と当時にI/Oが発生する関数を設けることでI/Oを実現して...
(例)F#の場合(F#はMicrosoft製の関数型言語でOCamlをベー...
#code(F#){{
println "Hi."
}}
という式を評価すると
()
という値が返り、画面に「Hi.」という文字列を表示するI/Oが...
*** HaskellのI/O実現 [#f19caceb]
Haskellでは、F#のように評価と同時にI/Oが発生する関数はあ...
#code(Haskell){{
println "Hi."
}}
という式を評価すると IO ()型の値が返されますが、この時点...
返されたIO ()型の値が、Haskellの処理系によって解釈されて...
Haskellでは、I/Oが行われる式にはすべて「IO」という型が付...
逆に、IOという型が付かない式ではI/Oが発生しないため、参照...
* まとめ [#g4802fc0]
この辺りの説明は、文字通りに受け止めておくけど、いまいち...
後で深掘りして、理解を深めたいです。
とりあえず、今の段階ではそういうもんだと受け流して、先へ...
** 愚痴 [#h4cad87d]
だいたいさ、一度値を決めてしまったら後で変更不能なら、他...
言葉の問題でしかないけど、変更不可能なのに「変数」と名乗...
初心者だと余計な混乱を来たすと思うので、ちょっと不親切だ...
だから、変数に値を「代入」とは言わないで、変数に値を「束...
それなら、最初からHaskellには定数しかなくて変数はない、っ...
細かいことだけど、こういうのもモヤモヤの原因になってる。
まあ、いいけど。
- Haskell 超入門 - Qiita
https://qiita.com/7shi/items/145f1234f8ec2af923ef
>''束縛''
Haskellの変数は後で別の値を再代入することができません。そ...
※ 値が変更できないので変数は存在しないという見解もありま...
- https://twitter.com/igrep/status/753946652352708609
>「Haskellに変数はない!」の本当の意味は「Haskellには『再...
- https://twitter.com/fumieval/status/754142523094773760
>「Haskellに変数はない」というのは完全な誤りで、むしろ再...
それなら「再代入のできる値を保持する構造」を何て呼べばい...
- 変数 (プログラミング) - Wikipedia
https://w.wiki/4XL4
>プログラミングにおける変数(へんすう、英: variable)とは...
変数を用いることで、データを一定期間記憶し必要なときに利...
高水準言語において、変数は記憶装置(メモリ)を抽象化する...
>一人一人の人間が異なる名前によって区別されるように、変数...
これにより、プログラム上で複数のデータを容易に識別・管理...
変数の識別子 (identifier) のことを変数名 (variable name) ...
一般に、変数が表すデータをその変数の値(あたい、英: value...
- variable とは 意味・読み方・表現 | Weblio英和辞書
https://ejje.weblio.jp/content/variable
>変わりやすい、変化しやすい、移り気な、変えられる、変動で...
「variable」という英語には、「可変の」という意味があるか...
命令型言語がこれだけ普及した現代で「変数」の定義を変える...
理路に矛盾があると思うわけよ。
実際、Haskellには変須がなくて定数しかなくても困らないなら...
もうちょっと先に進んでから提言してみるわ。
ページ名: