#デフォルト設定がカスタマイズできないといやだーという Gentoo 大好きッ子みたいな俺様もいますから
#currentをビルド中
#6.11.20090702
#そうか6.11に入っているのか
#hlint を 1.4 から 1.6.2 にあげた
#もう1.6.3になってるよ。:)
#くっ、ほんとうだ
##あー参加してみたい
##こっちかー
#[1..100]>>=penも参加するかもになってるし
#はやいな反応が
#hiratara さんは IRC-net の #haskell:*.jp
#にボットを常駐させている
#(わたしも、いるときは lambdabot を置いてる)
#2009-08-11 か
#hlint 1.6.3 にした
#もろ平日か、ある意味他のプライベートなものと重なる可能性は低いな
#いいかも
#ふだんは地方だが、お盆で関東に帰省している人もくるかも
##Haskell hackathon をやるなら行きたい (精神力つけて
#ただ、9 月の数学会のために、8 月と 9 月は時間がとれない(個人的事情
#体調面からみても、10 月以降かなー
#となると、企業の人がこんどは忙しくなるんだろか
#hlint 1.6.3 にあがった、ありがとう
#Hac φのように、organizer をやるべきなんだろな、僕もそういう歳になったのだし
#と、Hac φや RubyKaigi などを見て思った
#current は常に現行のバージョン + 0.1 ですよ、少なくとも GHC 7 までは。
#1.4. GHCのバージョン番号付け規則
##あらら、翻訳版の不安定版スナップショットへのリンクが間違っていますね。
#元のドキュメントだとリンクは正しいのですが。
##あぁぁぁ
#昼休みに本屋に寄ったらワナが
#つい大人の科学を買ってしまった
##なんて非道いことをするんだ>学研
#また財布が軽くなってしまたt
##こっちが本筋だった
#おおっ。わしも先程本屋でみつけて買おとした。でも箱がもげてて、やめてしまった。まだあったら帰りに買うかなぁ。
#そういえば、CPUの創り方も4bitだったっけ。
#Lavaで書いてみるかなぁ。
#曙橋の本屋には綺麗なのが平積みされてたよー!!
#じゃぁ10セットくらい買っとく?
#豪気だねぇ
#どうせすぐ壊してみたくなるから。。。
#CPUの創り方も4bitCPUでしたね。
#壊してみるの?
##こういうのも動画でアピールされると、もうダメポ。
#負けるなという方がムリ
#とりあえず。壊すのが王道。
#TK-80とか復刻あったけど所詮Windows上で動作させるエミュレータだものなー
#あとプログミングをWindows上でやってって種類のものもどうも萎える
#TK-80モノホンのを復刻してくんないかな
#復刻して売ればけっこう売れそう?
#売れんじゃない?
#以前も言ったけどCPUの創り方が出たとき
#あれって当時結構な値段したような気がするけど
#秋月でキット出るんじゃないかとワクテカしてたのに
#秋月が
#かぶった
#本によると8万円台だった模様。まだざっとして読んでないから誤解してたらゴメンだけど
#CPUの創り方のキットでたら2セットは買うつもりマンマンだった
#その値段じゃ売れないね
#今でも遅くないぞ>秋月
#そうだ。そうだ!ってここで言ってもなーー
#だからこそ今デアゴスティーニあたりが2.5Kで出せば
#もうオレみたいなのが大人になってさー
#うわーって群がる
#ハズ
#遅くないぞー>デアゴ
#おおそれだ。初回475円!
#全部あつめるとあの懐しのTK-80
#いいなぁ夢があるなぁ
#CPUの創り方ではほとんどの回がメモリの実装になりそう
#それより、一ヶ月待てるのか!?という罠
#待てるかっ!!
#なので大人の科学でも良い
#どこでもいいから出してくれー
#そうだよねぇ。
#それがでたら次はアルテアが…
#ほほう
##こういうのが子供のころほしかった。
#テルミンpremiumなんてのもあるんだ。
##ああ物欲妖怪にとりつかれそう。
#DELUXなんてあるんだー
#真空エンジンいいねぇ"鉄"って感じが
##あ、ごめん違った
#真空エンジンの動画がかっけー
#火吹いてる
#おうおういいねぇいいねぇ
##ああもうとまらん。自重すべし>わし
#うちの学校の先生が買ってた > 大人の4bitマイコン
#おお、お友達だ
#ああ買いにいきたくなってきたぞ。。。
##長っ
#この真空エンジンの冷却ファンの貧弱さがなんとも
#つか、こういうデザインバランスっていーなー
###ろりつっこみ
#loli とか hack とかの作者の人のコードはいろんな意味ですごいと思う
#(.) :: a -> (a -> b) -> b
a . f = f a
infixl 9 .
#とかやって if list.null then ... とか書いてる
#ちなみに Haskell を使って書かれた過去のシステムに LOLITA というのがあります。
##OO風に書くための常套手段
#(.) = flip ($)
#Parallel Haskell 関係の過去の論文で出てきます。> LOLITA
####はどう? > OO 風
##って?
#hs-dotnet (旧称 Haskell dotnet) だと (.) の代わりに (#) を使っていますが。
##ああそういう意味ね。OO風といったのは、
#Javaとかの . をさしていっただけです。
#ああっ、言葉足らずですね。まあ、いいか。
#OO プログラム風に見せかけるには、左から右への合成の記号も . に合わせたいということですね。
#合成というよりは結果の引渡しと言った方が良いですね、この場合。
#newtype の話に戻るんだけど
#newtype Int2 = My Int deriving (Show,Eq,Num)
a,b,c :: Int2
a = 5; b = 2; c = a + b
#こんなことできるんだ。
#なんで構築子 My をつけなくてもいいの?
#newtype ならでは?
#数値リテラルはNumのインスタンスに対してオーバーロードされているから。
#こんなことできるのは数値だけ?
#そう。数値リテラルだけだとおもわれ。
#こういうことが出来るのは、数値リテラルが Num a => a のような型を持っていて、Int2がNumのインスタンスだから。数値でなくても、同じような型を持っていれば、同じようなことは出来る。
#instance Bool Num where
# fromInteger 0 = False
# fromInteger _ = True
#不思議に見えるのは、数値リテラルがとても値っぽく見えるからかなぁ。
#a,b,c :: Bool
#あれ?数値リテラルって値じゃないの?
#a = 0; b = 1; c = 2
#値じゃないよ。
#えー何なの?
#数値リテラル
#newtype Int2 = My Int deriving (Show,Eq,Num)
z = 0 :: Int
a :: Int2
a = z
#てか数値と数値リテラルって違う?もしかして
#はダメなんだ
#そう。
#どっちがそう?
#値とリテラルは違う
#値かどうかは定義によるかなぁ。Haskellの値の定義ってあったっけ。
#a = z はだめ
#値の定義がないような気がしなくはないなぁ。
#二重否定はよくわからん
#値はシンタックスにはあらわれないから。
#確かにそういう意味では値ではないですね。
#値は定義されていない。
#あー、なる>シンタックスにはあらわれない
#a = 1とかのことね?
#そう。
#定義は式じゃない>シンタックス
##がだめなのはIntとInt2は型がちがうから。
#newtype を data にした
#data Int2 = My Int deriving (Show,Eq,Num)
#が
#Can't make a derived instance of `Num Int2'
#はなんで?
#なんで newtype ならいいの・
#それは、derivingで任意の型クラスに対して使う機能が、newtypeにして提供されてないから。
#newtypeにしか。
#cut-sea が newtype の話出したのは "Turning difference list into a proper library" に関して?
#なにそれ
#RWHの "Turning difference list into a proper library"
#お、差分リスト
#え?私そんな質問してましたっけ?
#それはおいらじゃないと思う
#あーあれかRWHで訳してて
#その流れで質問したやつかな?隠蔽云々の
#そうそう、多分。
#なんで、newtypeにしか提供されていないかというと、P Int と P Int2 を相互に変換する一般的な方法はないので、両者が同じメモリレイアウトを持っていることを仮定して、coerceするしかないから。これはnewtypeでは保証されるけど、dataでは保証されない。
#そこの後に
#2 `mappend` 5 :: MInt
#というのが出てきて、それ見て「え、構築子つけなくていいの?」と思ったというわけです。
#そこはあまり覚えてないな(w
#なるほど、納得できそうな気分 > sakai
#勉強になりました。数値リテラルの件はまだちゃんと理解してないので後で考える。
#さっきみたいにBoolをNumのインスタンスとして宣言すると
#if 0 then "Never" else "Always" とか書けたりする。うれしくないけど。
#どっかのLLっぽい
#しかもBoolとみなす扱いを好きに決められるわけか
#fromIntegerだけでなく、(+)とか(*)を定義しとけば
#if 0+2 then "Always" else "Never" とか
#if 1*2 then "Always" else "Never" とか
#data
#でも
#data Int2 = My { unMy :: Integer } deriving (Show,Eq)
instance Num Int2 where
fromInteger = My
x + y = My $ unMy x + unMy y
x - y = My $ unMy x - unMy y
x * y = My $ unMy x * unMy y
abs x = My $ abs $ unMy x
signum x = My $ signum $ unMy x
a,b,c :: Int2
a = 5; b = 2; c = a + b
#ならいいのか。
#勉強になるなあ。
#明示的にインスタンス宣言してしまえば桶
#hogelog にこのチャット部屋のこと報告しておきました。
#Haskellのコードをはるによいサイトってどこだっけ。codepadだっけ
#うーん
#チュートリアルとか少し見てたんだけど
#数値リテラルと数値の違いがよくわからないです
#圏論勉強会の場所、秋葉原だと不便な人いましたっけ? > sakai
##小杉と秋葉原どっちがいい? > sakai
#整数および浮動小数のリテラルはそれぞれ、 (Num a) => a および (Fractional a) => a という型になる。 数値リテラルはこのような間接的な方法で任意の対応する数値型の値に 解釈されるように定義されている。多重定義の曖昧性の議論については 4.3.4 節を見よ。
#ってあるから区別はされているのはわかるけど、何が違うのやら
#私はどっちでもいいよー > 圏論勉強会の場所
##秋葉だとどこでやるの?
#ここで言うわけにはいかんのだ(w
#メードカフェじゃないよ(w
#えっ。そうなの?なんでだろう?
#ま、まさか。
#メードじゃない人は近くにいます。
#ああ執事のほうか。
#使用料を忘れたので調べてからにします。
#執事になっちゃうのか・・・
#あぅちがうのか。ひざまくら系?
#Haskell ではいくつかの種類の数値が用意されている。数値型はおよび その上の演算は、Common List および Scheme の影響を強く受けている。
#ひざまくらはして欲しくない人だと思いますが。
#↑Common ListになってるYo
#ともかく秋葉原某所の話はここまでにしてください。
#うえ
#何章? > cut-sea
#さっき data Int2 書いたとき negate 定義しなかったのになんで Warning でなかったのかと思ったらデフォルトで
#x - y = x + negate y
negate x = 0- x
#になってたのね。
#そう
#あれ?何章だっけ
#いろいろ見てて見失った
#しかも手元の向井さんの入門Haskellで
#リテラル引いたら206ページになってるのに
#リテラルの文字がみあたらん
#みつけて修正した。
#インデックスおかしいかも
#ふつはすどこいった
#場所移動します。家に帰り着いたらまた覗きに来ます。では。
#マンガの下敷きになってた
#乙。
#鍋の下敷よかましか。
#リストリテラルという言葉はあるが
#説明はない
#ぐぅ
#ふつはすでは説明はないよ。
#> Numと数値リテラルの関係
##みつけた!か?
#リテラルの厳密な定義は「評価すると式そのものと値とが等しいもの」となります。数字の「0」は式ですが、評価しても「0」ですのでリテラルです。文字列「"Haskell"」も式ですが、評価しても「"Haskell"」ですのでやはりリテラルです。
#んんんん?
#リテラルは式だと言っておられるのか?
#評価したら値でなんか違うって言われても、はいそうですかとは・・・
#>省ける括弧はなるべく省く、というのがハスケル流のようです。
#「ハスケル流」ってカタカナで書かれると妙にむずむずする
##OK!
#式でいいのか別に
#ようやくsakaiさんの言ってた意味がわかった
##ところで「数値」ってなんですか?
Haskell 的には、じつはこれは簡単です。 Num クラスのインスタンス型のもの、これが数値です。では Num クラスだとどういう良いことがありますか?
Num クラスに属していると、数値リテラルを作ることができます。 fromInteger というメソッドが Num クラスにはありますが、たとえばソースコードのなかに「80」という数値リテラルがあるとき、これが PortNumber と解釈される文脈であれば、それは80番ポートということです。 FD であれば80というファイルディスクリプタです(ふつうありえんけど)。ほかにも、 257 を Word8 で解釈すれば1ですし、Word16で解釈させると257になります。なお、型を変換するには toInteger を使って Integer 型にしてから fromInteger にするか、その型が Enum であれば fromEnum と toEnum で Int を介して変換できます。
整数でない数(浮動小数点数や有理数やあれこれなど)は、 Fractional という型クラスに属しますが、こちらには fromRational というメソッドがあり、「1.2」のような数値はこのメソッドを介して変換されます。なお toInteger は Integral のメソッドなので、 Fractional な型では整数を介して変換できません。 floor とか ceiling とかで整数に変換してから fromInteger で整数にするか、 toRational と fromRational で整数でない型同士の変換ができます。
#なるほど
#なんとなく数あ値g
#数値がわかってきた(小学生かっ)
#Haskellのコードに値はあらわれない。
#表れているのは表現expressionだけ。
#expression のほうだけ
#リテラルはexpression
#OK!
#式
#でもまだnewtype云々の話はついていけてないやほとんど
#newtypeのどの部分?
#あーいーんだ理解した
#そこはOKだった。
#さっきのsakaiさんの言ってたことと上の引用(青)のと
#チュートリアルのところとでようやくわかった
#ただし、明示的にインスタンス宣言かけばOkだけど
#dataのderivingでNumクラス継承しただけではだめってのは
#なぜだかまだわかってない
#ああそれは冷静に読めばわかると思う。
#newtype宣言には制約があったよね。
#つまり、newtype宣言のときは、Numクラスのインスタンスの宣言を自動的に導出できるけど、data宣言のときはできない。ということ
#dataでは不可能なことがnewtypeでできるということは、newtypeにはそれだけ導出に有利な制約がくわわっている。
#制約があったってのは構築子を付けること?
#Numクラスのインスタンスの宣言を自動的に導出できるってのは構築子=fromIntegerと器械的にしちゃえばできるってことかな?
#いやdataでもそこは同じだな
#newtype宣言ではデータ構成子は1つ。さらにそのデータ構成子は引数をひとつだけとる。
#あーorz
#教えてもらった。確かに。
##この制約のおかげで、内部的にはnewtypeにはデータコンストラクタが付いていない。
#内部的にはnewtypeで作った型はデータコンストラクタの引数の型と同じ
#なので、データコンストラクタの引数の型が属しているクラスのインスタンスであるという導出は簡単にできる。
#もし複数の構築子があったら種類が出てくるからですね
#で、もし複数のパラメータを取るなら、どれかが特定できなくなるからですね
#内部的に構築子が付いてないってことはそれがnewtype宣言されたものって区別はどうやってるの?
##あくまでも実装系での工夫
#うう、構築子クラス・・・あたりからもうついていけない
#でも少しだけわかった気がする
##栄光のグラスゴーなのね
#The Glorious Glasgow Haskell Compilation System User's Guide
#GloriousはSystemにかかると考えるのがもっともらしいかも。
#あ、いや
#単に最初に見せてもらったページがTOPへのリンクが見当たらなかったので
#何のドキュメントかと思ってね
#上むきの矢印なかった?
#ああ栄光の・・・か、と
#んー今見直してるけどないよなぁ
#URLをつめて確認したのよ
#あるでしょ。ページの一番上に。
#おしゃれなやじるし
#ないじょ
#うわ
#なんてこった
#やっぱり予想通り
#IEだと見えない(w
#firefoxで見たら見えた
#へぇーそうなんだ。知らんかった。
#IE8だからか?
#なんかIE8っていろいろある
#ところで
#山本さんとnobsunの副作用の議論はやっぱり私にはよくわからん(w
#ええっどこが?
#どこもかしこも
#やまもとさんの主張が理解できないというのならわかる。
#気になる。だれの、どこの主張がわからない?
#どっちのも実はよくわからんかった
#そもそもあの議論ってなんで発生したんだっけ?
#Haskellには副作用がある
#という人と
#ないという人がいる
#あーそうだったそうだった
#OK
#で、副作用の定義があいまいなのが云々って話の主張はわかる
#それを定義しないとねと
#で、nobsunの定義は変数束縛の書き換えだっけ
#そう
#んー
#へん?
#いや、そうじゃなくて
#そう定義すれば副作用がある世界での議論をしてしまっている気がする
#え?
#なら、参照透明性が成り立たない場合がある、という定義にすればいいんじゃないの?
#うまく言えないけど、だからよくわからなかった
#ああ。それは危険。参照透明性をどう定義するの?
#なんだろうな
#副作用がないので参照透明です。参照透明なので副作用はありません。
#ということになりかねない
#式の一部を、等しい別の式に置き換えても、全体の意味が変わらないこと。
#うん
#それはまぁわかる
#ライプニッツ則が成立するための条件が、変数の使用が参照透明的であること。
#つまりさ、定義してるというか定義できる世界観というか視点を提供した時点でそれが存在する
#という議論になる
#っちゅーか
#そんな感じ
#うまく言えないな
#おれの中では
#「向心力」と「遠心力」じゃなくて
#「波」か「粒子」かを議論したのにすげぇ似てる感覚がある
#という違和感
#に近い
#つまり立場によって見えかたが違う。
#とりあえず両方とも間違ってると言ってるんじゃなくて、ともかくよくわからなかったのよ
#それはkazuさんの主張
#そう・・・かあn
#かもね
#うん、そんな感じだな
#kazuさんて山本さんのこと?
#そう。
#いや、両方(^^
#ふーむ。
#おれだけ?わかってないの?
#そんなことはない。わしもよくわからん。
#わしは実行系も含めれば、副作用があるという主張がよくわからない。
#あるいは環境まで含めてしまえば副作用はないという主張もよくわからない。
#立場によって見え方が違うというのは、kazuさんの言う遠心力と向心力の話もそうだけど
#あれは所詮相対的なものであって
#環境や実行系の話は私もよくわからなかった。
#同じ価値観の中に両者がいるので立ち位置を変えるだけで理解しあえる
#でもさ
#最近私が思うのは
#相対的なものなのかもしれないけど、相対的なもの同士の位置関係
#がはっきりしていないんだもの
#副作用の議論のほうは。
#OK
#そうだな
#それでも両者は「力」が働くという価値観は共有しているから
#同じ土俵で議論可能
#で、分かり合える。どちらも妥協することなく
#でも「命令型言語」と「関数型言語」はどっちかが
#その共通する「力」にあたるものがない気がしない?
#計算可能性
#変数?
#どっちかの計算モデル(という世界観・価値観)にあゆみよる必要があって
#それをやっちゃうと「副作用のある世界」での「副作用があるかないか議論」
#か「副作用のない世界」での「副作用があるかないか議論」になるような
#記述と意味の問題だと思うのだけれど。
#そんな感じ
#でもさ
#数学はよくしらないけど
#プログラマが記述しているもののなかに副作用と呼べるものがある。
#で、
#その記述と意味ってのが「定義しようよ」なわけじゃん?
#あるなしは副作用の定義のしかたによる。
#違う?
#そう。
#定義するのに副作用などというものがそもそも考えられない世界では定義できないよね
#副作用を定義できるんだとしたら当然副作用がある世界を想定して議論をしてるわけだ
#あるかないか議論じゃなくてどれが副作用にあたるかの対応を取りたいならまぁわかる
#その世界のなかで定義する必要はない。その世界の外で定義しないといけない。
#世界の外で定義って?
#そうでないと別の世界と比べられないでしょ。
#いや、その世界の外で定義するという概念がわからない
#世界Aでは副作用はありません。世界Bでは副作用があります。
#というためには、世界Aと世界Bを外側から見てないと。
#比較にならない
#その議論は常にできるとは限らない
#あれちがう?
#実際物理の世界ではそうだった20世紀後半
#どういうこと?
#計算機の世界でダメだと言ってるわけじゃなくて
#常にそういう議論はできないよなーと思う
#ああ
#では言い方を変えよう。
#うむ
#Cプログラミングの世界には副作用はある。
#これは正しい?
#副作用=変数束縛の書き換え
#とか
#参照不透明なコードが書ける
#とかという意味ね
#はい
#Cでプログラムを組んでたら普通にそう表現するね
#ちょっとごめん。上の「ライプニッツ則が成立するための条件が、変数の使用が参照透明的であること」って、意味はわかるけど、意図がよくわからなかったんだけど。
#「変数の使用が参照透明的であること」がライプニッツ則の必要条件だとしても、ライプニッツ則の概念自体は参照透明性によらずに定義されるよね。
#別に循環論法になったりはしていないと思うのだけど。
#そうです > sakai
#意図はね。副作用とは何か
#という問いに
#参照透明
#云々というと
#19世紀後半か、今21世紀だよなー
#じゃ参照透明ってなに
#ってはなしになる。
#確かに、それはちょっと入り込みたくないところだねぇ。
#で、なんで参照透明がでてくるの?ということになる。
#そう。それを避けたい。
#参照透明が何かというのは、哲学的な話もあって、そっちにいくのは避けたい。
#そうなの?
##コンピュータ界の参照透明の概念は妙な含みがいっぱいあってそこを整理しないといけなくなる。」
#なんかえらく簡単そうに説明してはります
#たとえば
#じゃあ、参照透明はやめて、ライプニッツ則の不成立で副作用を定義するというのは?
#ちょ(w
#難しいなやっぱり
#クワインかなんかだよね、確か > 参照透明
#そう。
#もともとはたぶんフレーゲくらいまでさかのぼるような気がする。
#Referential transparency, definiteness and unfoldability http://www.springerlink.com/content/x83n623522w8g565/ #なんだか面白そう。
#ああ、それそれ、その論文
#そもそもライプニッツ則って何?ググっても微分とかしかでてこない
#同じものを同じもので置換してもよい。
#それがライプニッツ則?
#そうです。
#妙な含みとは?
#"同じ"とは何かとか?
#Referential transparency, definiteness and unfoldability
#という論文にあるんだけど。
#sakaiさんがさっきあげてくれたやつ
#definetenessとかunfoldabilityとかno-side-effectとかいろんな概念がいりまじっているということ
#どっかにメモがのこってるはずだな。ちょっとさがす。
#メモによれば
#あるのか
#何でも読んでるな、nobsunは
#参照透明性は
#- definiteness
#- no-side-effect
#- determinancy
#unfoldability
#- extentionality
#- leipnitz law
#などの概念で説明されている。しかし、それぞれはかならずしも
#同じ概念ではない。
#w
#最初は明確性かな
#おまけに非決定性のある計算を想定すると話はややこしい。
#次が副作用がない
#次が決定性?
#unfoldability??
#展開可能性
#なんかアルクでも出てこないぞよ
#そうなんだけど。その分野ではちゃんとした用語だと思う。
#ともかくいろいろ説明する必要のあることがいっぱいあるから避けたいと
#そう。
#なるほどー
#まあ、ここで数年前の私の意見を聞いてくださいよ。
#Haskell は同じ引数で同じ関数を呼べば同じ値が返ってくると聞いてる。
#ghci を使ってみた。
#getCh(だっけ?)
#お
#あらわれた>数学者
#をうって文字を入力すると
#入力する文字が違うと
#表示される文字が当然違う。
#どれはどういうことなんだと。
#初心者に説明してくれ。
#ふむ
#これはどういうことなんだ。
#結果が違うじゃないか。
#ghciをつかっちゃいかん!
#w
#いじょう
#ちがうだろ
#わろす
#それはね
#ああそういうことか。
#初心者はまずそう思うのだ。
#getChじゃなくてgetCharを使うんだよ
#思うね
#それでは納得しないよね。
#getChってgetCharとは違うの?
#w
#納得しません
#ghciはgetCharの値を返しているわけではない。
#昔はそういう関数があったのか。
#ないと思うけど。。。
#副作用を認識するためには自分が同じ環境に居続ける必要があるんだよ
#(てきとー
##goferにあったからじゃないかな。
#でも 1+2 を入力するとその結果の3がちゃんと表示されてるじゃないか(と初心者)
#そうだそうだ
#ghciは相手を見て対応を変えるんだな。
#1+2 は print (1+2) なんだよね。
#性格がわるいから
#だす。
#そんなことは初心者の知ったことではない(w > sakai
#その割には参照透明とか気にするのね(w
#初心者だとおもって馬鹿にしているのはghciなんだよ。
#だから使うなって。いったろ。
#初心者は。
#それはおいといて
#getCharとやったらなにがかえってきた? 初心者君
#a と打ったら a が返ってきた
#ように見えた
#aと打ってaとかえってきたんならそれでいいじゃん。
#a(リターン)とうったら'a'と表示されてプロンプトが返ってきた
#ほほう
#なら b と打っても a が返ってこいよ(と初心者)
#おお、なんだか面白い展開に
#いや、そうは思わんぞ
#bとうったらbと返ってほしくないの?
#なるほど
#いや、欲しい (w
#でも同じ関数は
#同じ値を返さないといかん
#うったものが返ってきただけじゃん。なにか不都合でも?
#というジレンマ(w
#randomとかの方が例としてはよかったのかな。
#いやいやaをもらったらいつもaをかえすんじゃなにがわるい?
#randomIO か。
#getChar を呼んだらいつも同じ値が
#返ってこないと
#getChar呼んだら何がかえってきた?
#Haskell の同じ値を返しますよ宣伝
#困るんじゃないか(と初心者)
#だいじなことだから3度いいます
#getCharを呼んだら何がかえってきた
#呼んだだけでは止まったままです(w
#(w
#そうそれがgetCharが返したものだよ。
#それでは初心者困ってしまいます(w
#なんで?
#先に進めないから(w
#何が返ってきたのかよくわかりません
#そりゃ印字できないもの。
#そんなよくわからないもの返されても初心者は扱いに困ります。
#いや、論旨がずれてる
#そんな勝手な初心者の都合なんかしらん!
#なら <action> 返せよ(w
#同じ関数を同じ*引数*で呼んだら同じ結果が返ってくる
#そりゃghciの実装者にゆっとくれ
#と唄っているけど
#で関数ってどれのこと?
#標準入力から入力されたものに依存するとは聞いてないぞ!!
#どの関数もそうじゃないの?
#もういちどいいます。
#どの関数を呼んだの?
#getChar。。。
#ここでいったんCM入ります。
#ううう
#数秒私にください。
#ほう。それ関数なの。どこにそんなこといってるやつがいるの?
#CMだってば
#ないですね
#了解
#どこにも
#1時間単位で借りれて1時間1000円。
#0引数の関数なんじゃないの? と初心者は思わないか。
#あ
#ですぐ納得する初心者がいたら
#ほんとにCMきた
#やり直し(w
#世話がない
#1時間単位で借りれて1時間1000円。
#広さ:73平米、長机:10台、パイプ椅子:40脚
#流し有り、トイレ有り、ホワイトボード有り
#有線LANあり(ただしハブなし)
#携帯電話の電波届きにくい。窓際だったらぎりぎり届くかも。
#です。
#?
#秋葉原某会議室
#いいかも。
#ふむふむ。
#0引数の関数だと思いそうだ
#明い?
#でも思い込みだね
#本番どうぞ。
#CM終わり。
#で、じゃあgetCharってなにさ?
#関数じゃないなら何だよー!!
#と逆ギレ
#IO Char
#照明?明るい。
#IOってなんだよー
#IOはIO
#それは説明になってない
#なんで?
#じゃHogeってなに?
#Charってなに
#なんでそれが説明になっていると思えるのかの方が不思議
#Charは文字の型
#Hogeは知らない
#IOは入出力の型
#少なくとも文字が何かを知っているから知っている言葉で説明してあげないとだめ
#入出力の型?
#文字ってなに
#?
#なんか、ぜんぶ未定義術語な感じなのかしらん。
#いや、知っている言葉なら別にいいんじゃない?
#知らない言葉が出てきたときに説明を求める
#それを自分の知っている概念とすり合わせられればOK
#どういう説明がいいか考えるから、文字ってなにかおしえて?
#言語情報を表記するためのシンボル
#文字は'a'とか'b'とかだよ
#他にもあるけど
#IO Char は getCharとか他にもあるかもしれないけどそんなものだよ。
#で?
#あれおわり?なっとくしたの?
#その関係が意味?
#その関係とは?
#初心者君は nobsun にいじめられて疲れました。後は見学しつつ寝ます。(もしかすると突っ込むかも)
#getChar が IO Char の値であるという関係とかとか
#「文字」はおれの知っている言語から見るとHaskellにもある「文字」と同じみたいだよ
#Haskellの文字を知っているなら同じだと思ってくれていい
#いやべつにいじめてないよ。
#明日朝から体操の練習なんだ。寝不足で頭から落ちて死んだらあんたらのせいだ(責任転化)(w
#他にもあるかもしれないけど、そんな関係によって、公理的に意味を考えているのかなと。
#いじめられたんだい!(と初心者)
#(w
#いやそんなに深く考えてない。
#でどこまでいったんだっけ>cut-sea 儂の番?
#「文字」はおれの知っている言語から見るとHaskellにもある「文字」と同じみたいだよ
#Haskellの文字を知っているなら同じだと思ってくれていい
#なにを答えればいい?
#からやり直させてくれー
#桶
#IOってなに?
#雑誌にあったな
#入出力だよ
#入出力するポートのこと?
#そこを流れるデータ?
#ちがう
#入出力うけたまわりますという看板のことだよ。
#ディスクリプタのようなもの?
#それとも入力ストリームとか?
#ちがう
#看板
#昔チャットにはまって朝までやってたことを思い出すなあ。チャット面白い。
#健康のためにほどほどにね。
#ただの看板?
#看板って、リードオンリーとか、読み書きオッケーとか、そんな感じのことを表したものでしょうか? (とか言ってみる
#ってことは実際に入出力はしてないの?
#ちがう。看板
#入出力してるよ
#うちの店はそんなインチキしませんぜ。だんな
#IOは看板で入出力もしてるの?
#IOは看板、入出力してるのうちのみせの優秀なスタッフ
#うちのみせ?
#ってHaskellのプログラムでいうとどれです?
#あんたが頼んだ店
#店ってプログラムのこと?
#ちがう
#実行プロセス?
#なにそれ?
#たべられるの?
#プログラムを実行しているプロセス
#そんなのいるの?
#じゃあ思いつかないのでうちの店ってどこですか?
#ここ
#chaton?
#どこで頼んだの?
#getCharで頼んだつもりです
#一文字読んでって
#標準入力かな
#getCharは注文書だよ。
#その注文に応えてくれるのが優秀なスタッフ?
#そう
#うちの店ってのがどこのことかやっぱり良くわからないので
#そのスタッフというのがどこにいるのかわからない
#そりゃわかんなくて当然、企業秘密だもの。
#ghci?
#え?そうなの?
#そう。
#スタッッッフー、スタッッッフー
#Haskellのコードを書いてみました。
#信頼して、注文書書いといてくれればよきにはからうから。
#それで?
#注文書はgetCharだけ?
#いろいろあるよ。
#ほかにはどんな注文ができるの?
#文字の印字
#putChar
#さっき書いたコードをコンパイルして実行したんだよね
#getCharって注文書を2枚書いて出したんだけど
#うん。
#最初のは'1'って返ってきた
#どこに?
#二つ目のは'2'って
#え?
#どこに?
#ch1 = getCharってしたからch1かな
#あ、違う
#テーブルか?
#どこにあるのそれ?
#目の前のテーブル
#注文書に書いてある?
#優秀なスタッフは書かなくてもわかる。
#優秀なスタッフはそんな勝手なことはしない。いわれたことだけする。
#あまり優秀じゃない(w
#そんな勝手なことしてヌルポだすのが優秀なの?
#そもそも何の店だっけ?
#注文書だしたら入出力してくれる?
#そこはそれ日本人の阿吽の呼吸で(w
#するよ。
#getCharって注文書出したら何をもらえるの?
#なにもあげない
#え???
#入出力するだけ
#ぼったくりだー
#入力された文字がほしいんだけど注文書だしたあとのフォローは?
#どうフォローするか書いといてくれればやったげるよ。
#あー、しまったナンバーズ始まってた。
#注文書に書くとこないよー
#じゃあもらった文字を大文字にして印字したいんだけど
#どう書けばやってくれるの?
#別の注文書をくっつければいいよ。
#また注文書かくのか
#くっつけるってホチキスでいい?
#入力した文字を印字してと書いといて
#それとものりじゃなきゃだめ?
#bind
#それなに?
#のり?
#ほっちきす
#はじめてなんでどんな風にくっつけて出せばいいか教えて
#getCharを先にだすんだよね?
#getChar >>= putChar . toUpper
#これ全部注文書?
#3枚あるの?
#つないだので全体でひとつの注文書
#最初に書いたgetCharで1枚じゃないの?
#でもってputCharで2枚目
#大文字にしてってのはおたくでもやってくれるの?
#これはうちのすたっふがやるつもりだったんだけど
#注文書に書いてあればやるよ
#注文書に書かないでうちでやりたいな
#だんな
#なんだ
#なに?
#冗談いっちゃいけません。
#なんで?
#だんながすることは注文書を書くだけ
#うちのスタッフはData.Charって店と提携してるから
#得意だよ
#入出力はできないからお願いするけどさ
#Data.Charってのはね。注文の束だよ。
#なんか台本できてる劇見てるみたいだ(w
#え?店じゃないの?
#ちがうよ。
#おれHaskellのプログラム?
#おれ誰?
#Haskellのプログラマ
#プログラマなんだ
#getCharは注文書だったよね
#そう。
#toUpperも注文書?
#ちがうよ。注文だよ
#注文書に書く文言
#大文字にしてくださいって?
#そう
#でもこの注文書は別の店にだすんじゃないの?
#ほかのみせってないの?
#ないことはない。
#おたくの店の名前おしえてくんない?
#指名できないよ。
#名前ないから
#じゃあどうやって呼べば来てくれんの?
#おれの仕事不定期だけど急ぐ時は急ぐよ
#注文書書いて手配師に渡してくれればいいよ。
#手配師ってだれ?
#どうやってそいつに連絡とればいいの?
#runghc
#とか
#ghc
#とか
#呼べばいいだけだよ
#ghicって結構融通きく手配師いなかったっけ?
#彼好きだな
#話せるし
#ghciか
#あいつはやめときな。
#なんでさ
#なにやらかすかよくわかんねから。
#しゃべりすぎんだよね。
#たのまれもしないことかってにやるし
#でも手配師の資格もってるじゃん
#たのまれもしないこと?
#もってないよ。
#頼まれもしないことって?
#まぁいろいろさな。
#たとえば?
#だって今の話からすると
#勝手に評価するし
#評価?
#何を評価するの?
#注文書の出き
#出来?注文書がよく書けてるかとか?
#ちがう
#ちゅもん書に書いてある字
#getChar >>= putChar . toUpperだとrunghcに頼めばどこまでやってくれる?
#全部。
#ghciだったら何余計なことするの?
#そんなこと尋いてどうするの?
#だって
#便利なやつだとおもってることが余計なことだったりすると
#runghcに頼んだ場合、やってくんない可能性があるっていう風に聞こえるし
#だからつきあうなって。
#じゃあとりあえずrunghcに頼むとして
#そうしな。
#ほかにも店があるっていってたよね?
#その店も名前ないの?
#支店ってとこかな。
#ないよ
#支店ってことは注文書がそっちにまわったりもするってことかな?
#下請け?
#そうだよ。
#じゃあうちからみたら同じみせ?
#そうだよ
#じゃあgetChar >>= putChar . toUpperって注文書を書いたつもりだけど
#これって一枚なの?
#一枚だよ
#複数の注文がホチキスで閉じられてるんじゃないの?これ
#閉じちゃったから一枚じゃん。
#あーそういう勘定するのか
#まーいーけど
#注文するけど
#ふつうじゃん
#注文の結果は?
#手配師に尋いて
#runghcに聞くの?
#渡したあとに?
#すこしまたされるかもしれんけど
#聞いたらなんて答えてくれるの?
#そりゃ。無事すんだかどうかだね。
#入力の結果とか、そーゆーのは?
#そんな途中の仕事を見せるなんてことはしないよ。
#えー?
#見せてくれないの?
#だってghciは逐一報告してくれたよ?
#すげぇ使えるやつだったのに
#だからあいつはおしゃべりだっての。
#でもあいつのおかげで注文の仕方をいろいろ変えて試せたから便利なんだけどな
#なんでrunghcはやってくれないの?
#なんか問題でもあんの?
#だってオレクライアントよ?
#途中が見たけりゃ注文書にそう書いときな。
#どうやって書けばいいの?
#そーゆーのあるんなら早く教えてよ
#なにが見たい。
#getCharしたときに入力された文字かな
#getChar >>= \ c -> putChar c >> putChar (toUpper c)
#この注文書どう注文してることになるの?
#>>ってノリ?
#ほっちきす
#さっき教わったホチキスと違うみたいだよ?
#簡易版
#手抜きしてんの?
#2種類も使うのいやなら
#getChar >>= \c -> putChar c >>= \_ -> putChar (toUpper c)
#真ん中の注文書はなんて注文してんの?
#とってきたの印字
#さっきも印字するように言ってたけど
#その結果は見れないって言ってたじゃん
#同じ印字を2回も依頼させて
#余分に金取る気だな?
#見たいというから印字したのに文句あるの
#runghcに聞いてもやったかどうかしか答えてくれないって言ったよね?
#その時とおなじような注文書を真中につけてるだけだから
#やっぱりあとから聞いてもどんな文字が入力されたかわからないんじゃないの?
#だれがrunghcに聴けっていったね。
#あれ?いわなかったっけ?
#手配書渡せ。仕事が無事すんだかどうか教えてもらえ。といっただけだよ。
#ちゅもんしょだ
#もしかして入力の結果は前の注文書でも見ることができた?
#できないよ
#ああそうか大文字にするように注文したから?
#そう
#ところでさ
#副作用って何?
#なにそれ美味しいの?
#おたくの店には関係ないのか
#なにそれ?
#しらないのに関係あるかどうかわからないじゃん。
#なにか言ってくれれば判断できるけど。
#いや知ってるかと思ってね
#おれもよくしらないから
#しらないねぇ
#念のために聞くけど
#知ってるやつに尋いといて
#なに
#支店って何?
#支店はしてん。注文書をまわすところ
#実家 now
#おばんです。
#それは注文書の書き方で制御できる?
#注文書を支店に回すように?
#ども
#制御ってなに?
#できるよ。
#どう書けばいいの?
#forkIO 注文書
#OK
#さんくす
#c'est finit?
#c'est fini?
#おしまい?
#うん。OK
#でもよくわからなくなったけど
#あらら。何が。
#入出力を関数にすることは技術的にできないのだろうか
#IO Charは関数ではない
#うん。
#関数にできるよ。
#つまりHaskellは入出力は関数とは別のものだとしている
#ダイアログ?
#いままで、前のログみてた。さつばつとしてるな :)
#関数にできるか
#というのは
#どういう意味
#そもそも関数と関数でないものはどう区別してるの?
#Haskellでは型だね
#a -> bみたいになってたら関数
#->があるかどうかかな
#もちろん type F = Int -> IntとかされてF使われたら
#レイヤが上がってわからなくなるけど、それは置いておいて
#だって type Fun a = a -> a になってりゃわかんないじゃん。
#かぶった。
#たとえば
#表面の理解をしようとすると難しいので、Haskell の処理系の中間言語 Core をみよう
#Core のソースじゃなくて、定義ね
#getChar stdinみたいにしてCharが返ってくるような仕様つまり getChar :: FileDesc -> Char
#殺伐としているわけではなくて、初心者が疑問におもうところだけを質問し、それにだけ答えるという形式で問答をしてたんです。
#みたいなのってほかの言語だとこんな感じだと思うんだけど
#"Types are calling conventions", Haskell'09, M.C.Bolingbroke & S.L-P.Jones の FH とかは Core よりさらに見やすく整理されて書かれている
#そういう風な選択にならなかったのはどういうところに問題があるのかな?という
#それって擬データ
#なんだっけそれ、どっかで聞いたぞ
#一時期実装しようとしてたやつ?
##はだれにでもすすめられる
#すんばらし
#{a}は確定するとaになる。
#擬データ
#非決定性を陽にあつかえる。
#似た話が、Types are calling conventions に書いてあるよ
#それは?
#昔WayToHaskellerで「mainは関数だと思ってたけど型が関数になってないぞ」と書いたのを思い出した
#同様にgetCharについても関数だという思い込みがある
#lazy な言語で、データを評価する戦略をどうしたらいいだろう?というのは自然な問いである
#なぜ関数ではなくIO ()というものが出てきているのか?
#その答えとして、
#使い方がちがうんだな。
#ほかの言語に対応が出てこない
#つまりね。
#Int : 評価前 <Int> : 評価してもいい, ...
#関数が関数のままほっとかれているんですな。
#みたいな記法を用意しておいて、型+αの、より豊かな中間言語をつくり
#実行してみてはどうだろうか、という提案
#関数適用がどこにもでてこない。
#どこにも出てこないとは?
#Cでも似たようなことがあるでしょ
#Cのmainて
#思いつかない
#関数だよね
#Yes
#それいつつかうの?
#それがプログラムに書かれてない。
#ああ、暗黙のルールですかね
#でね。
#IOついてるけど。mainだって関数とみていいわけだね。
#getCharだって関数としてみていいわけ。
#みていいの?関数だと?
#もちろん
#getCharに引数わたしているところがどこにもない。
#見ていいってのは、Haskellで?
#もちろん
#引数の個数 = 0
#ちがう
#引数はあるのだけど。
#え、thunkだって意味だとおもた
#ちがうちがう
#thunkをもちだしちゃだめ。
#レイヤーがちがう。
#環境か
#World
#そう
#プログラムとしては、関数を合成しているだけで、どこにもWorldを渡すところが出てないでしょ。
#そういうことなの。
#関数適用をしない関数というわけ
#このWorldまで含めると副作用はないという山本さんの話になるんだけど
#それって関数の外から見るか内から見るかみたいなことでないかなと思うんだけど
#問題は、実引数のWorldはだれが作ったのか。ということ。そのWorldを見ているのはWorldの中からじゃないということ
#誰が作った?
#run-time?
#とかそういう話?
#うん。
#Worldを含めると副作用がないように見えるという話がありますね?
#山本さんいわくの
#runtimeでは副作用があって、というんだけど。runtimeというのはまさしくWorldを構成して引き渡す行為じゃないの?
#Worldの話ってmainに限った話じゃなくて自由変数を含む関数かどうかって話に一般化できると思ってたんだけど
#もうすこし説明して。
#worldの話って
#ふむ。
#worldが引数にあらわれてないから副作用があるように見えるけど
#worldを引数にも返り値にも露出させると
#違う引数worldで違う結果world'を返すようになるから純粋だと
#なんとなく関数の中と外とで持ってる環境が違うから
##そう見えるという意味で
#GHCi (むかしの) は runStmt :: Session -> String -> IO RunResult
#わたしの中では、それで副作用がなくなるわけでも生まれるわけでもないんじゃないかと
#Session が、GHCi の中に閉じ込められた World
#(というか状態)
#今の文脈の IO の World とは別の世界
#そうまさにそのとおり
#simonだ
#> それで副作用がなくなるわけでも生れるわけでもない
#で、
#自分の立ち位置(関数の中とか外とか)が
#での結局。副作用の定義が曖昧なんだと思わざるを得ない。
#変わってないという世界観で計算を見るか
#都度変わっているという世界観で見るかで変わるんじゃないかなと思うんだよね
#リスト処理の再帰関数の中にいるとする
#再帰で都度呼ばれるたびにcdrダウンしたものが呼ばれるんだけど
#その内側にいる私は
#同じcarを呼んでるのに
#毎回違う結果が返ってくる
#と叫ぶ
#それって副作用じゃないですね
#HaskellでいうWorldってのは、その話をしている自分はそのなかにはいないでしょ。
#一方副作用の世界を考えている人はその世界の中にいるわけ。
#だからそこなんだな。
#で、同じじゃないかと思うんですよ
#でも同じ環境にいるという世界観にいるから副作用に見える
#でもworldがそう特別には思えない
#でね。中にいる場合にはね変化するものと変化しないものの区別があるわけ。
##なんだこの#って
#Primだからかprimitiveね?
#ああまさにWorldの実装だね。
#data RealWorld
#なんかFreeBSDのmake worldみたい
#unboxed type とよばれております : #
##昔matzと似た議論をしたけど。
#私の認識では「中にいるときに区別がある」と思っている派と
## 自体は magic hash
#「中にいるときに区別がない(あると思ってない)」派があるんじゃないのか?と
#それはない。
#前者はいても後者はいないとおもう。
#常に自分は同じ環境にいると思うから環境変わってないのに結果が変わった>副作用
#となるんじゃないの?
#コンテキストが変わったという認識があれば結果が変わるのは不思議じゃないんだし
#そうじゃなくて、
#なんといえばいいかな。
#鉛筆が机の端から床へ
#おちた
#まず中の定義をしてください ---> 中と外に区別はないので中ってなにっていう問いがどうも変
#関数の中と外って感じ
#ちょっとまってね。中と外の区別が厳密にできという
#たちばと、できないという立場に結局はなりそうなので。。。
#机の
#上にあった鉛筆
#と
#いま
#机の下におちている鉛筆が
#同じものだと思うたちば
#これを考えると。変らないもの鉛筆と変ったもの鉛筆の位置
#で。かわらないもの付随するなにかがかわったので。これを副作用とよぶ。
#OOPだよね
#関数プログラミングのたちばでは、かわる、とか変らないとかという概念はない。
#それはOK
#なんか以前その話会社でしましたね
#オブジェクトのプロパティを変える(年とったとか結婚して姓が変わったとか)
#そうそう。だから副作用があるとかないとかはHaskellの話しじゃなくて別のところのなにかの話である。
#これは同一人物だという世界観にささえられている
#同じポインタをさすようにしてるから副作用で表現している
#関数型の世界観は今の自分と次の瞬間の自分が別
#そう。Haskellでは同一人物かどうかには興味はなく。それがどんなじぶんつかだけに興味がある。
#頭の中も違うし新陳代謝によって肉体的にも時間とともに構成要素が変わるわけで
#それぞれ別の値として全部表現してますね
#一番最初に私が言ってたのは、そういう世界観の違いによって双方の世界に対応する概念すらないってことがありうるので
#そのとおり。
#副作用を定義するというアプローチではうまくないのではないか?ということを言いたかった
#そもそも。CのりくつをHaskellにもちこむのはむりがある。
#副作用を定義する=>副作用が存在する世界観での話をしようとしている
#もちろんそうで。
#その世界観で見たとき。
#Haskellでは対象の不変性には興味はなく。
#とうぜん。不変とそうでないものの対比にも興味がないので。副作用云々ということ自体意味がない。ただ、
#それでもあえて、副作用のあるせかいで定義された副作用というものに相当するものがあるか。
#というなら。
#まず、その副作用を定義してくれ。
#そしたら答えられる。
#変数の束縛を変更することが副作用だというなら。そんなものはない。
#なお kazu-yamamoto 氏は、「釣り記事」書いて楽しんでいるんじゃね?疑惑があります
#w
#この徹夜で議論したタイミングで・・・・
#釣りの要素はないことはないけど。この話にかぎれば、じつは対面でrealに話していたものです。
#入出力が副作用だというなら?
#入出力の記述ができるということが
#副作用があるというのなら
#副作用はある。
#参照透明性云々なら、参照透明なのだから。。。
#*記述ができる*ではなく*入出力が起こる*なら?
#結局。Haskellの範囲がどこまでかとは関係ないと思うんだけどね。
#入出力がおこるとはどういうことか。
#それをおこしているのはだれか。
#それをHaskellが起しているというなら
#Haskellには副作用があるということか。
#だからruntime
#じゃさらにそとがわにある。環境のはなしはなんだっけ。
#さらに外というと?Worldのほかに?
#それは知らないぞ
#環境までふくめば。うんぬん
#山本さんの?
#3パターンあって。評価器まで、実行器まで、環境まで。
#それは最後はWorldまで含めて考えれば副作用はない
#そうkazuさんの
#Worldを考えてないと引数や返り値にWorldやWorld'が出てこないので
#引数が同じなのに結果が違う=>副作用がある
#みたいな話だった
#Haskellの中だと副作用なし=>runtime含めると副作用あり=>Worldまで考慮すれば副作用なし
#そういう流れ
#そこがおかしい。結果がおこるのは引数をあたえたからで、引数を与えなければなんにも起らない。
#そのstatementはわかるが、それはWorldを与えたことにかかってる?
#getCharは実行されると値を返すといってるけど。getCharが実行されるとは
#どういうことかに触れていない。
#実行されるって「一文字読み込む」っていう動作のことを言っているんだと思う
#それ以外に思いつかない
#動作が何かを誰に返すの?
#どうさはどうさであって値じゃない。
#誰だろう?
#悩むことじゃないか
#キーボードからの入力をプログラムに返すってのが命令型言語におけるイメージで通りそうに思う
#プログラムはそれを受け取ってごにょごにょ*処理*する
#これに対応する動作が計算機上で行われているのだとするとHaskellではこの現象を
#- んなもん知ったことか
#だからプログラムにはその実引数がどこにもないでしょ。
#- これこれこういうものに対応する
#か
#その実引数って?
#トップレベルで入力した文字が見えているところはどこにもないでしょ。
#どゆこと?捕捉きぼんぬ
#補足
#c = getChar ();
#プログラム中に入力文字がないってこと?
#Cか
#とさえ書けば、
#cならトップでcを見れるでしょ。
#Yes
#getChar :: World -> (c,World)だとしても。
#type IO a = World -> (a,World)
#でもどこにもWorldが渡されていないんだから。cが見えているところはない。
#Haskellの場合。
#Because Emacs can be regarded as an /evaluator/ and he likes Emacs Lisp (Suck!) very much, he wrote the blog, I guess.
#Hasellの外側つまり、プログラマが書いたコードの外側もふくめて議論してなんの意味があるんだろう。
#という気分。
#プログラマの書いたコードの外側で副作用云々してなんの意味やあらん。
#トップレベルじゃなければ現れる?
#*トップレベルで*入力した文字が見えているところはどこにもないでしょ。
#↑これ気になってる
#λ変数としてはあらわれるよ。
#getChar >>= \c -> putChar c
#ですね
#トップレベルだとまずいのはなぜだっけ?
#The chief can cause an (usually, bad) accident as a side-effect, acctually.
#まずい:=プログラマの書いたコードに現れるかどうか云々に影響するか?
#誰がそれを作ったか
#getCharがつくったの?
#c = getChar ということになる。
#c <- getChar
#トップレベルで書けないでしょう?
#in the do notation
#doはsyntax sugar
#sure
#I mean, it's maybe confused that 'c' in the phrase 'getChar >>= ¥c -> putChar c', and 'c = getChar'
#BTW, it's over 5 a.m. You continued very long discussion.
#not too much
#本来の話に戻って
#ふむ。
#Haskellの説明をするときに「副作用があるという風に説明する人たちもいる」
#もともと
#そう
#kazuさんは
#それをHskellをどこまで含めるかによるんではないかと分析した
#Haskellだ
#それはRWHのなかで、IOはピュアなコードから副作用のあるコードを分離する
#あったね
#覚えてる
#という記述を指しているとおもわれ
#and he loves Emacs
#それに対してnobsunの意見はどう含めるかには関係ない
#副作用の定義次第だ
#そう。
#でも結論として「Haskellの中にはない。外にはあるかもしれないけど外を議論してなんになる」
#well, without unsafeXXX
#総合するとRWHなんかではHaskellの外を含めてHaskellを説明しているってことでOK?
#as you saw recently
#それは私の結論ではあるけれど、私の副作用の定義による結論であるので、kazuさんがそれで納得するとはおもえない。
#RWHの説明はそうではない。
##and the next one.
#RWHの説明ではHaskell以外では副作用なしにはかけないであろう入出力を表現するコードのことを
#副作用のあるコードと呼んでいるだけ。
#Cプログラマという立場からみた見えかたで、RWHがいっている副作用というのは
#遠心力と同じで、見掛けのもの。
#おおざっぱには把握できたけど
#遠心力と向心力のくだりはまぁ比喩なのでこだわることはないでしょうが
#ピンときてない
#Haskell strictly separates pure code from code that could cause things to occur in the world. That is, it provides a complete isolation from side-effects in pure code.
#(quoted from RWH Chap.7)
#complete isolation
#つまり副作用が問題にされるのは
#みかけの力であるということが重要で説明のためにそういう力を想定しているわけす。
#RWHの著者らがruntimeまでふくめてHaskellであり、その場合Haskellには副作用があると言えると思っているということは考えにくい。
#関数の振舞いが予測しにくく(管理しきれなく)なるからですよね。ざっくり言って問題があるから
#で、結局のところそういう問題がコード中に含まれないならなんの問題もないわけです。
#Reading a book is far from learning concepts from the book.
#当然コードのどこを見渡してもそういう部分が一切なければ無問題
#In my opnion, kazu-san reads the RWH.
#そうです。
#ところがあのいかにも命令言語的なdo構文でいかにも命令言語的に副作用があるかのように見えて
#kazuさんはRWHを自分ででも読んでいる。
#しかも、そんなコードをにたいして、そういう(見かけの)副作用はこう書くんだよ的説明ができるんですよね
#(ああ、だんだん文章がおかしくなってきあt)
#そういうコードが一切なきゃいいけど、そういう説明というか見方ができちゃうコードがあるから
#副作用ないよね?大丈夫なのかな?となるのでは?
#違うのかな
#実行系をふくめてHaskellと呼ぶといのもひっかかりはする。
##Some people consider do notation considered harmful
##の説明がいちばんまともなんだけどなぁ。
#i don't like it very much. do-notation
#I like both
#esp. let in do
#だめだ。集中力切れた。すんませんが寝ます。
#Good night
#わしもねる。すまぬ。Good morning night :)
#hehe
#Nice discussion about the side-effect in Haskell