nobsun
はい,let-束縛で変数を束縛するのは値ではなく,計算であるというのは理解できました.
「サンク」であることと「停止しない計算」とは区別できないように思いますがどうでしょう.
「サンク」であることと「停止しない計算」とは区別できないように思いますがどうでしょう.
オブジェクトは大きく分けて2種類ある計算の1種類だけでよいような気がしますがどうですか?
「サンク」であることと「停止しない計算」とは区別できないように思いますがどうでしょう.Haskellの関数は基本的には値を取るため、オブジェクトがサンクかどうかを判定することはできません(GHCにはunpackClosure#のような例外あり)が、書き手が区別しないわけではないというのが重要だと思います。
計算の1種類だけでよいような気がしますがどうですか?サンクは計算を指し示していますが、計算そのものとは別に扱うべきで、実際のモデルと乖離した定義をする(GHCなら17種類あるものを全部"計算"と呼ぶ)ことには賛成できません。
評価完了していない値を_|_と書くのは、Wikipediaに載ってる不動点意味論の流儀なのかなあと思うのですがなるほど、これは僕の勉強不足でした :bow:
Haskellでは let x = 1 2 はxに(1 2を計算した)値を束縛しているのではなく,言うとしたら(call by name的には)1 2という式自体への束縛,または(call by need的には)1 2という計算自体への束縛というのが正しいと思います(なので記事の値への束縛というのが誤った使用法というのはHaskellでは誤りというのに同意です).
また、「λ変数」「意味関数」のような一般的に使われていない用語を定義せずに持ち込むのは、議論が困難になるので避けていただきたいですすみません.「λ変数」は「束縛変数」,「意味関数」は「評価器」と読みかえてください.今後は,この用語は使いません.
値をバインドするとしてしまうと、評価していものをバインドできない(したがってcall-by-needにならない)というのは本文でもこの議論でも触れたとおりです。ここのところは「値をバインドするとしてしまうとcall-by-needになるような評価器を作成できない」と解釈してもいいですか?
Haskellから機械語へのコンパイラをHaskellで作れば絶対に理解できます。はい,是非挑戦してみたいです.
call by valueを実装してみればよいのでは無いでしょうか?これもちょっとやってみます.
eval $ Let [("bot",Div (Con 1) (Con 0))] (Con 0)