haskell-jp / mmlh #2

@as_capabl has joined the channel
手元の環境で動作させてみました。WIn7 + デフォルトターミナル + 最新stack環境だと、日本語を出そうとした時に文字コードエラーで落ちるみたいです
ちなみにassets以下をshift_jisに変換すると動きます。
ああ、chcp 65001は必要そうですね。。。そこは大分気を遣ったはずだけどなぁ。。。
chcp 65001で動くのであれば、根本解決はしないでドキュメントに載せる方向で行こうかなぁ。
やっぱりchcp 65001すると回避できるっぽいですね。
すみません、やっぱり手元で直せたっぽいのでissueを待たずにそのままpull request送ります。
特に二重にCIを実行する意味もないので、Pull requestのpush時のみCIを走らせるよう修正しました。
これで修正できたはず :kanryo:
Win7だとchcpしてもフォントが日本語にならないという問題があったっぽいので、今回の対応が良いです。issue入れられなくて申し訳ない
@wado has joined the channel
issue にする方が良いかもしれませんが、気になった点です。

4問目の do記法でgetContents関数と細い左矢印<-を使って、入力を受け取る の部分で意図的に 代入 という単語を選ばれているような気がしますが、束縛と代入の違いについても簡単に説明した方が良いと思います。

https://github.com/haskell-jp/makeMistakesToLearnHaskell/blob/master/assets/4.md#do%E8%A8%98%E6%B3%95%E3%81%A7getcontents%E9%96%A2%E6%95%B0%E3%81%A8%E7%B4%B0%E3%81%84%E5%B7%A6%E7%9F%A2%E5%8D%B0-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%85%A5%E5%8A%9B%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B
それはここではしたくないです。私がうまく説明できる自信もないですし。それらは突き詰めればバックグラウンドにある言語の違いでしかないと思っていて、実用上それらを区別しなくて困ったことがないためです。
質問です。

それはここではしたくないです。
他の課題で触れるということでしょうか?(それとも、今回は触れないという意味でしょうか?)

文章の内容から推測するに、他の言語を知っている人を対象としていると思うのですが、その際に既存の 代入 を知っている人は、当然 再代入 ができるものと考えるはずです。

この辺ってどのように理解してもらう予定でしょうか?
現状まだ検討してないです。 let を使いたくなったあたりかも知れません。

当然 再代入 ができるものと考えるはずです。

それは一概に言えないです。代入があるから再代入ができるということは本質的ではないです。他の言語でも定数に代入すると言いますし。

またそれ以前に、実際のところshadowingしてしまったら再代入と区別ができなくなります。だからある意味で再束縛もできてしまうと考えた方が自然ではないでしょうか?
束縛であれ代入であれ同じ名前に再び割り当てることができるか否か、というのは本質的な区別ではないのです。
まあただ、それを踏まえた上で「代入」が初出した時点で脚注を加える、というのはありかな、という気がしてきました。
https://github.com/haskell-jp/makeMistakesToLearnHaskell/issues/9#issuecomment-431660589 のコメントのとおり、これからHTMLに書き出すよう変換しようと思っていたため、脚注にしたことによって読みづらくなるリスクが低くなったので。
それは一概に言えないです。代入があるから再代入ができるということは本質的ではないです。他の言語でも定数に代入すると言いますし。

do
  input <- getContents


本文中で上記のコードに対して inputという変数に代入する と説明しているため、ここで input を定数と考える人は少ない気がします。
そのため、 input を通常の変数として認識した場合、よくあるプログラミング言語を知っている人であれば、自然に変数 input に対して再代入できそうだなと僕なら思うのですが、そうでもないのかな・・・。

またそれ以前に、実際のところshadowingしてしまったら再代入と区別ができなくなります。だからある意味で再束縛もできてしまうと考えた方が自然ではないでしょうか?
shadowing すれば、確かに再代入のように見えます。が、再代入ではありませんし、shadowing は GHC がデフォルトで警告を出すように Haskell の書き方として推奨されていないように思います。そのため、他言語に親しみのある人に対して代入という言葉を足がかりに Haskell を説明すること自体は良いと思うのですが、背後にあるプロセスについては簡単で良いので説明した方が良いと思うのです。(新しい変数を作ってそれを使っていると言えば良いだけなので)
そもそも Haskell が 純粋 と言うのはそういう部分に支えられています。

まあただ、それを踏まえた上で「代入」が初出した時点で脚注を加える、というのはありかな、という気がしてきました。
必要なら、何かしら代入と束縛の違いについての文章を書きますよ!

これからHTMLに書き出すよう変換しようと思っていたため
少し思ったのが、実際に試してもらう際は静的にリンクされたバイナリをどこからかダウンロードして利用するという方法でしょうか?
現状でも初回ビルドで2~3分ぐらい?かかるので、pandoc を依存関係に入れるとかなりビルドに時間がかかりそうな気がします。。。
shadowing は GHC がデフォルトで警告を出すように Haskell の書き方として推奨されていないように思います

もちろんその通りです(しかし、細かいですがデフォルトで警告は出ません)
なので、「再代入はできないよ(少なくともしない方がいいよ)」という点さえ強調してしまえばもはや束縛か代入か、というのは実用上区別しにくいので、その点はちゃんと触れたいと思います。
現状でも初回ビルドで2~3分ぐらい?かかるので、pandoc を依存関係に入れるとかなりビルドに時間がかかりそうな気がします。。。

悩んだんですが、ギリギリまで開発をしたい、なおかつassetsがある関係でインストールが若干困難なので、ソースからインストールしていただく予定です。
そのための https://haskell-jp.slack.com/archives/CAXQ09PN2/p1540705016008000 でもあるのです。
(しかし、細かいですがデフォルトで警告は出ません)
! いつも出てるからデフォルトかと思ってました。すみません!:cry:
ついでに Docker ファイル作るための設定も PR 出して良いですか?:thinking_face: