プログラミングと現実世界と哲学の話
- its_out_of_tune
- 12096
- 13
- 2
- 0
つか、「λ計算におけるλ式」でないものをλ式と呼ぶのがややこしいというのなら、評価する度に値が変わったり、場合によっては値すら返さないただの手続きの塊を「関数」と呼ぶのはどうなのかと小一時間(ry
2012-10-05 22:28:19そういう意味だと、Pascalは関数(function)と手続き(procedure)の意味が分けられていて好感が持てる。使ったことはないが(
2012-10-05 22:31:17@myuon_myon あーなんか誤解があるような気がするんですけど、多くのプログラミング言語において「関数」が「数学でいう関数」を指すのでないのと同様に、色々な言語で導入されている「λ式」は「λ計算におけるλ式」を書くために使われているわけではないです。
2012-10-05 23:31:16@NaOHaq ラムダ計算におけるラムダ式を実装した言語もあります そしてそれがラムダ式と呼ばれる以上、そうでないものをラムダ式と呼びたくはありません(使う使わないの問題ではなくてできるできないの問題ですよね?)
2012-10-05 23:33:10ちなみに、functionという用語が文字通り数学的な関数の意味で使われている(知る限りで)数少ない言語の一つはPostscript
2012-10-05 23:35:40@NaOHaq まぁ、そういうことです HaskellとかPythonのラムダ式はそのままラムダ計算のラムダ式ですから、そうでないものをラムダ式と呼ばないでということですね
2012-10-05 23:35:59@myuon_myon プログラミング言語的な関数も, 見方を変えると(environmentを暗黙に引数として取っていると看做すことで)数学的な関数と同一視できます.
2012-10-05 23:37:56@myuon_myon int x; int plus_x(int y){ return y + x; } とします. このとき関数plus_xは大域変数int xの値に依存して挙動が変わります.
2012-10-05 23:45:39@myuon_myon 全ての大域変数と, それに束縛されている値のペアからなる連想配列をenvとします. 改めてplus_x(int y, Env env) { return y + env["x"]; } と定義すれば, これは元の引数と, 環境を取る関数とみなせます.
2012-10-05 23:48:26@myuon_myon @YuishiYumeiji HaskellだとIOモナドがそれに当たると思います。 IO a はEnvironment -> (Environment, a) という型の関数とみなすことができます
2012-10-05 23:53:05@YuishiYumeiji 何となく分かりましたけど、それって明示的に環境を受け取っていますよね?暗黙的というのは前者の函数をさして言っているんです??
2012-10-05 23:53:16@NaOHaq IO aって*->(*,a)何ですか?じゃあIO aにEnvironment型の何かを作用させることが出来るんです?
2012-10-05 23:54:22@myuon_myon はい, 前者は後者のsyntax sugarとみなせます. プログラミング言語的な意味での関数と, 数学的な意味での関数とが互いに移りあえるのだから, (移りあえる限りにおいて)前者を後者と同一視しても問題ないのでは, という発言です.
2012-10-05 23:58:23@myuon_myon そういうことです。Stateモナドに包まれた計算は、getとputに関して変数のような働きをします。
2012-10-06 00:00:37@myuon_myon プログラマが明示的に作用させることはできません。ここでいうEnvironment型の値はHaskellのランタイムが起動時に与えます。またEnvironmentへのアクセスは実装が隠蔽されていてHaskellのプログラムからは見えません。
2012-10-06 00:03:44