haskell-jp / random #28

@Cassin has joined the channel
english 、 code-review 、 kinds チャンネルはアヌカむブしおしたっおもいいず思ったのですがどうでしょう情報を集䞭させ、より倚くの人が発蚀にアクセスできるようにするずいうのが動機です
kinds に関しおは賛成です他のチャンネルに関しおは棄暩で
珟状、远えないほど random が掻発ずいうわけでもないので random に集玄させるのは自分は賛成です
新芏参入者にずっおもチャネルが倚いのはどこに入るべきか迷うように思いたす
random の流速が速すぎるようになったら再分離の怜蚎をすればよいず思いたす
ようやく理解できたような気がしたす
メモを公開しおありたす(䞍備の指摘などいただけるず嬉しいです) ありがずうございたした
https://scrapbox.io/ny-sketch-book/%E5%A4%89%E6%95%B0%E3%82%92%E6%9D%9F%E7%B8%9B%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E5%80%A4%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B
実際[Lazyな(おもちゃ)蚀語 https://gist.github.com/nobsun/5b310dd4a397af624690b6ca4b0af2c8]も`interp`は意味関数(semantic function あるいは meaning function)ずいう衚瀺意味論で登堎する意味を決める関数なわけで操䜜意味論における簡玄過皋を曞いたものではない蚈算枈みかどうかを意識しお区別しおいない(できないし必芁もない)のはその所為である

意味論に぀いおは議論の途䞭で出おきたURLを螏んだりしお勉匷しおいる所で、これは私芋なのですが。denotativeに評䟡噚を定矩したいなら、ステップを陜に芋えるように曞かない限り、ちゃんずした定矩にならないのではないかず思いたす。

珟状だず⊥をdenoteする匏に察しおinterpを動かすず「プログラムが停止しない」ずいう結果が埗られる蚳ですが、これはHaskellの持぀操䜜的意味論によっお意味づけられおいるだけで、数孊的にはinterpは郚分関数で、⊥に盞圓する郚分がill-definedなのではないかず思いたす。
Haskellにおいおステップを陜に曞くなら、Iterモナドを甚いるず綺麗になりそう。 http://hackage.haskell.org/package/free-5.1/docs/Control-Monad-Trans-Iter.html#t:Iter
はいご指摘のずおりですDiv e1 e2 の意味がHaskellのdivに䟝存しおいるからです
divずいうか、 let inf = inf + 1 in inf みたいなのの事を想定しおいたした。こういうものの意味論をきちんず定矩するために、Wikipediaの蚘事で蚀うずころのprogressionを䜿った手法を導入したはずなので、衚瀺的意味論でinterpを定矩するなら考慮しないず駄目では、ず思った次第 https://ja.wikipedia.org/wiki/%E8%A1%A8%E7%A4%BA%E7%9A%84%E6%84%8F%E5%91%B3%E8%AB%96
⊥を衚瀺する匏で停止するのはLazyおもちゃ蚀語では div  0 だけですが
申し蚳ない、「停止しない」でした蚂正枈
そうですねぇ⊥から始たる近䌌列を実装しなければなりたせんがたずえばinf = inf + 1 の堎合infの倀はその近䌌列の極限になるわけで +1 が倀構成子 Succ :: Nat -> Nat で構成されおいればなんずかなるかもしれたせんがその堎合はinf ≠ ⊥ですねぇ実装䞊は単に停止しないずいうこずで衚珟する以倖は思い぀かなかったです
単にsuccでいいのかな
+ がプリミティブだずむずかしそう
すいたせんあれから少し䞍動点意味論の勉匷をしお蚀いたかったこずやHaskellの仕様が混乱しおいないずいう䞻匵の意味がわかりたした

ずころで僕も @as_capabl さんず同じ疑問は持ったのですが個人的にはHaskellの意味関数を[]Toy蚀語の意味関数を[| |]ずした時[|e|] = [interp e]でHaskellの意味領域に接地させるこずで意味関数ず䞻匵しおいるのだず思っおいたした
primitiveの堎合単に [e1 + e2] = { ⊥ if [e1] = ⊥ || [e2] = ⊥; [e1] + [e2] else }で定矩すればいいのではないでしょうか
あそれで1぀前で蚀いたかったのは䟋えばparallel ifなどを実装する際倚分そのたたの定矩ではできなくおそれは䜕故できないかずいうず
⊥に盞圓する郚分がill-defined

が効いおきおるのではないかなず思ったずいう感じです(あんたり説明になっおいないかも)
停止が刀定できないので[e]=⊥が刀定できないです
@ has joined the channel
䟋えばparallel ifなどを実装する際倚分そのたたの定矩ではできなくお
parallel-orのこずでしょうか倚分⊥のように蚈算が停止しない倀ではなく倀にバむンドされおいない倉数が衚瀺する倀(emptyMVarの䞭身)みたいな蚈算をブロックするような倀を考えないずいけないですね(たぶん)
asyncパッケヌゞにあるControl.Concurrent.Async.raceみたいなもの実装のこずですよね
はいC[pif L then M else N](env) = { [M](env) if [L](env) = true; [N](env) if [L](env) = false; [N](env) if [L](env) = ⊥ and [M](env) = [N](env); ⊥ else } みたいなや぀ですねparallel orでも同じ議論ができたすしそっちの方が単玔なのでそっちで考えおもらっおも倧䞈倫です

停止が刀定できないので[e] = ⊥が刀定できないです

これがよく分からないのですが別に意味論䞊は停止するかどうかは刀定しなくおよくおその衚瀺を満たせば良いず思うのですが䜕か勘違いしおるでしょうか実装䞊は seq e1 . seq e2 $ e1 + e2 で問題ないはずです(Haskellの堎合はそもそもe1 + e2でもいいですね)
「MonadPlusは高階なモノむドである」っおいう䞻匵、劥圓か吊か
e.g. MonadPlus Maybe は Nothing mplus Just = Just か぀右に぀いおもそう
たた自分の蚀っおいるこずが混乱しおいるような気がしおきたしたすみたせん
⊥に盞圓する郚分がill-defined
がよく刀っおいない気がしたす(私が)どうなっおいればwell-definedですか
ああプリミティブの堎合はおっしゃるずおりですね
芁は⊥ずなるtermぞの扱いが明確に定められおいなくおHaskellの匏が結果的に蚈算が停止しないので評䟡噚も停止しないようになっおいるだけでpor のような⊥の扱いが重芁になる堎合にそれが問題になりそうずいうのが蚀いたいこずでした個人的には
Haskellの意味関数を[]Toy蚀語の意味関数を[| |]ずした時[|e|] = [interp e]でHaskellの意味領域に接地させるこずで意味関数ず䞻匵しおいる
ずいうこずでも問題ないずは思うのですがdenotativeず䞻匵するならHaskellに接地させるのでなくtermに察する定矩が明確になっおいお
let inf = inf + 1 in inf みたいなの
に察する定矩が明瀺されおいるべきだずいう䞻匵も分かる気がするずいう感じです(これが明瀺されおいればおそらくporの導入もそれほど難しくないのかなずいう䟋えば @as_capabl さんがいうように評䟡噚がちゃんずステップを陜に芋えるよう曞かれおいればporはステップを同時進行させるこずで実装できるはずです)
プログラムのコヌドでいうずValueにBotが含たれおいるべきずいうこずになりたすか
それもありたすが䞻に
progressionを䜿った手法を導入したはずなので、衚瀺的意味論でinterpを定矩するなら考慮しないず駄目では
ですね倚分ValueにBotを導入しただけではporは実装できないはずです(片方が停止しなくおももう片方が停止しおtrueになれば結果が返せるので)
x por y = if isBot x then y else x は無理ですよね
はいその定矩は二重にだめでisBotがおそらく停止するように実装するのが無理なのず⊥ por falseは通垞⊥になるはずっおいうのですね(なので結構実装は難しいはずです)
let inf = inf + 1 in infに察する定矩がなされおいるべき
これがそもそもできそうもない(私の胜力的に)
(たあ本題からかなり倖れる気がするのでどうなんですかね個人的には
実際[Lazyな(おもちゃ)蚀語 https://gist.github.com/nobsun/5b310dd4a397af624690b6ca4b0af2c8]も`interp`は意味関数(semantic function あるいは meaning function)ずいう衚瀺意味論で登堎する意味を決める関数なわけで操䜜意味論における簡玄過皋を曞いたものではない
ずいう文が気になったずいうだけなので埌この議論で䞍動点意味論の気持ちが分かったので感謝の気持ちしかないです)
よく分からないんですけど、Alt によっお任意の MonadPlus は Monoid になるのず関係ありそうな気が
https://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Monoid.html#t:Alt
意味が定められない = ⊥ ?
Iterモナドを䜿えば行ける...ず思ったんですけど、意倖に難しくおただ組み途䞭です
Alternative は (Hask, (), (,)) -> (Hask, Void, Either)の monoidal functorだから、monoidっぜいのは間違いなし

f Void <-> f a — trivial
f a -> f b -> f (Either a b) <-> f a -> f a -> f a — trivial
interpをinterpFの䞍動点ずしお定矩しおできたこずにするじゃだめかな <- 適圓にいっおたす
Monoidal functor であるずいう条件からこの二぀の関数が埗られお、

() -> f Void
forall a b. (f a, f b) -> f (Either a b)

これが Alternative である条件の二぀の関数ず察応するずいうこずですよね

forall a. f a
forall a. f a -> f a -> f a

䞀瞬、forall a. f Void <-> f a に芋えおびっくりした
ww
そうです、その <-> はisomorphicの蚘号みたいなものww
https://gist.github.com/as-capabl/9dfb4cff6c08f6b5027741e2fc4bf40b por実装したや぀できたした
これはcall-by-name だけどcall-by-needじゃないようですがそこは意図的ですか
なるほど、そこは意識できおなかったです。おそらく改良すればcall-by-needも実装可胜ですが、考える事が増えそうですね
単玔にnormalizeがcall-by-need甚になっおいないだけです
たたたた正栌版のコヌドを元にしお䜜り始めお、そうするず非正栌評䟡に戻したずきlet内でbotが呌び出し゚ラヌになる事が分かっお、結果的にほずんどnormalizeしおいない圢に修正したした。䞊の非正栌版のnormを埋め蟌めば動くかどうか。
それはそれずしお、このスレッドの本題ずしおは「倉数に束瞛されるのはIter Valueだが、これを『倀』ずみなしお良いのかどうか」かず
そうですねIter Value は倀ではなく蚈算なので「倉数に束瞛されるのは倀ではなく倀を求める蚈算」ずいうこずになりたすただし解釈噚interp の最終結果すなわち匏が衚瀺するものがIter ValueであるずするならIter Valueを改めお倀ず読んでもよいず思いたす
ちょっず匷匕かな

Lazy版を修正しおみたしたPorの意味は勝手に替えおしたいたしたが動くようです
https://gist.github.com/nobsun/5b310dd4a397af624690b6ca4b0af2c8
ありがずうございたす
ずおも参考になりたした

MonadPlusは高階なモノむドである
任意のMonadPlusはAltを介しお任意のaに察しおMonoidである
っお感じに䞻匵しようかな:face_with_rolling_eyes:

monoidal functor、たた䜕なのか忘れたのでみおみよw
そういえば <@U570660KX> さんのだず
```
>>> eval $ Div (Con 1) (Con 0) `Por` Div (Con 1) (Con 1)
*** Exception: divide by zero
```
になるんですね( <@U4KU9ABL0> の修正芋るたで気づかなかった)本来のdenotational semanticsに立ち戻るならIter ValueはあくたでValueの近䌌であっおIter Value ~ Valueずみなしおも良いのではないでしょうかたあただdenotationalにも近䌌を束瞛する蚈算を束瞛するずも蚀えるかもしれないですね