「モナド」を含む日記 RSS

はてなキーワード: モナドとは

2017-11-08

モナド理解してるやつは説明がへたくそ

モナドさっぱりわからん

記事という記事を読み漁ってもモナドはわからなかったが、分かったことが一つある。

モナド理解してるやつは説明がへたくそ

どれも 用語 と 概念 と 数学 と 使い方 と 歴史 と 関数言語 を織り交ぜて同時に説明してきやがる。

モナドが分かった実感は0。

例えば住所圏でいうと→わからん

もっと詳しく具体的にHaskellScalaで書くと→わからんモナドが分からないのにHaskellScala を使いこなしてるわけが無い。

ここまでくればあとは簡単ですよね→わからん

大体モナドを知りたいやつは、理解とか概念はどうでもよくて、少しでもわかった実感がほしいだけなんだよ。へたくそ

2017-10-14

図書館でなに借りたら良いか

気になってる本はこれ

読む優先度高い本とおすすめの本教えて

ラウィーニア、風の十二方位、闇の左手

ファウンデーション地球

八月の砲声 上・下 第一次世界大戦の起原

引き潮のとき四巻 

戦争の変遷 

革命群衆  都市革命 

ハイ・ライズ、沈んだ世界夢幻会社

自由からの逃走

都市都市

月曜日土曜日に始まる、収容所惑星

紙の動物園もののあはれ

からの帰還、スタニスワフ・レム コレクション高い城・文学エッセイ

ラヴローフのナロードニキ主義歴史哲学 ロシア革命先駆者たち ナロードニキ/ 旭 季彦 

モナド領域宇宙衞生博覽會、東海道戦争、旅のラゴス

流れよわが涙、と警官は言った、宇宙の眼

鏡像の敵、Uの世界時間

マッキンダー地政学デモクラシー理想現実

2017-02-16

ノマド」は「ノーマッド」と書いて欲しい

スタバ仕事をすることもプログラミングすることもない身としては、「ノマド」も「モナド」も「はてなでたまに見るよく分からない概念」でしかなく、ごっちゃになってはググっての繰り返しだった。

しかノマドロマサガ2ノーマッドが同じ由来だと気付いた瞬間混乱は消え去った。

これは特殊パターンだとしても字面が似すぎているから改称した方がいいと思う。

2016-05-25

http://anond.hatelabo.jp/20160525213232

バグがあって、ストリームに変な値が入った時、どこがバグなのか、追跡するのが困難でしょ?

第一に、それは、ストリームFRPの値の定義)の問題であって、ユニットテストすれば良い。もしくは単にFRPログを取れば良い。

グローバル変数ではそういうことはできない。FRPでは、岡部氏のFRPライブラリ特にそうだけど、基本的ミュータブルな値同士が関数リアクティブ連携されて常に整合性を保っているのだからグローバル変数の、各所で更新されたそれぞれの値によって全体の整合性が損なわれないように気を配らなければいけないという(テスト自体困難な)問題は発生しない。それがFRPの唯一とも言えるメリットだとも言える。

使用する関数問題じゃないし、「印」として引数に加えても別に構わないと思うが、君のいうグローバル変数問題と一緒というのはまったく違う。

岡部氏との争いって「OCamlGUIアプリ純粋関数型(状態渡し)で簡潔に書けるか」ってところじゃないよね?

いや、それがそもそもの発端であるブログの経緯には書かれている。説明されている方式GUIアプリまで書けるのか?と疑念が呈されたことがきっかけ。

岡部氏はFRP状態関数の外部に持ってても純粋関数型だ、と言ってて、そこで争ってるんだよね?

この論点は聞いたことがない。岡部氏がこだわっているのは非手続き型の宣言型で、純粋がどうとか議論はされてないように思う。

あと、OCamlGUI状態渡しで書いたら簡潔で無いのを「書けない」、「不可能」って言ってるのはわざと印象操作しようとしてるよね?

原理的に可能かという議論ではなく、実用的な範疇か?という議論。反対派ブログで出てきたコードは、本人が認めるように普通のやり方ではなく、実用的なコードだとは思えない。あと、FRP状態渡しは同じ複雑さだという主張も崩されている。そこが重要

Haskellで書けて、OCaml冗長になっても、書けるなら「書ける」、「可能」だよね?

段階を踏んだ上で、非FRPHaskellのIOモナドコードを誰かが書いたらいんじゃない?当面、最初OCamlの話だったのに、いきなりHaskellやElmのコードで書いて、そういうのがごちゃまぜに、何がどの言語でできるのかできないのか、誤魔化しがあると見做されたか制限されたんでしょ。実際には、OCaml関数型では冗長しか書けないと実証されたけど、そういうのがバレないように、別の言語を利用していたと看破されて当然の状況だと俺は思うね。

俺の書き込み他人といきなり結び付けられたから、電波だな、と思ったの。

俺1人か、とか、らくだや住井が含まれてない根拠とか、関係無いよね。

関係ある。君ひとりは、そうじゃない、と君ひとりが言ってもそれが本当だとは確認のしようがないし、

書き込みをみれば、君以外の書き込みもすべて、その一派ではない、とでも言いたそうだ。

http://anond.hatelabo.jp/20160524164501

関数型という枠組みの中にミュータブルな時間要素が純粋に収まるようにしているのがFRPだろ。

ストリーム関数の外部に持つFRP純粋関数型っていうのは少数派でしょ。

関数の結果が引数以外で決まるわけだからさ。

多分、純粋とかの定義もまた違うんだろうね。

関数型の拡張」で全部丸く収まると思うんだけど。

いやそもそも岡部氏が複雑なアプリになるとFRP必要

これはGUIアプリ(対話的なアプリ)ってことでいいのかな。

コンパイラだとかをFRPで書かないでしょ。

ユーザから入力リアルタイムに処理するプログラムにはFRP有効だよね。

事実、「駱駝」は「状態渡しはむしろ異常」って書いた上に、

OCamlでは」じゃないの?

全部純粋関数型(引数戻り値に収める、状態渡し)にするのを良しとするHaskellと違って、OCaml副作用部分的に使うのが普通で、IOモナドみたいな入出力までも純粋に書くための道具立てが揃ってない、それでちょっと冗長になる、ってことでしょ?

OCamlの元々の推奨スタイルならもっと短く書けるんでしょ?

俺はそう読んだけど。

それっぽい書き込みほどそうやって、事実誤認だ、と強調するから、なんで当事者でもないのに、そんなことが断言できて、電波だということになるんだ?

だって駱駝でも住井でもない面識も無い俺の書き込みが住井扱いされるんだもの

いやだから、どの関数で読み書きされようと、誰が書き換えようとも、時間にたいしてイミュータブルな定数なんだから、定数は定数なのよ。

いやだからグローバル変数使ってるプログラム欠点をそのまま持ってるじゃん

グローバル変数使ってるプログラム欠点説明する必要ある?

2016-05-24

http://anond.hatelabo.jp/20160524145224

よーわからんw 岡部氏は、自作ライブラリHPで、

FRP純粋理想とする関数型+時間で変化するストリームを値にマップして扱うリアクティブプログラミングの組み合わせ

まり関数型の拡張っていうなら誰も反対無いと思うんだけど。

FRPライブラリサブタイトルに、 library that provides first class reactive value 'over time' と書かれている、これ拡張じゃないのか?

https://www.npmjs.com/package/timeengine

HaskellのIOモナドみたいな別の抽象化DISりつつ、FRPこそ正しい関数型みたいに言うから荒れるんじゃないの?

IOモナドDisってるのかどうかまでは知らない。しかし、すでに出たサンプルからFRPの効力がまざまざと見せつけられている。

荒れるのは自由だけど、両方正しいとかそういうのじゃなくて、間違っている電波だみたいな叩きしかなくて、要するに感情論で反対派は反発しているだけでOK?

あるよ。

関数がどのパラメータ依存して、何を結果として返すのか明確になる。

グローバルな値を参照したり書き換えたりしてたら、関数の中身読まないとわからなくなる。

短いプログラムならそれでもいいけどね。

別の誰かが書いてたように、上位スコープ内に定義されてるDOMでも、数学ライブラリでもなんでも、引数関数に渡すのか?

グローバルな値を参照したり書き換えたりして

いやだから、定数なんだから書き換わらないんだよ、FRPストリームconst 定数なんだから

関数型のわかりやす説明であって、住井派に反対してるとか、岡部路線とかじゃないよね、と。

オブジェクト指向と対比して考え方をまず学ぶって岡部路線、住井グループはそれを目の敵にしていて集団的攻撃している様をみたプログラミングコミュニティは逃げ、その後、不毛な大地のみが残った。

http://anond.hatelabo.jp/20160524142313

FRP純粋理想とする関数型+時間で変化するストリームを値にマップして扱うリアクティブプログラミングの組み合わせっていうなら、別に誰も反論しないと思うけど。

まり関数型の拡張っていうなら誰も反対無いと思うんだけど。

HaskellのIOモナドみたいな別の抽象化DISりつつ、FRPこそ正しい関数型みたいに言うから荒れるんじゃないの?

全部の時間依存関数にそういうことをする意味はない

あるよ。

関数がどのパラメータ依存して、何を結果として返すのか明確になる。

グローバルな値を参照したり書き換えたりしてたら、関数の中身読まないとわからなくなる。

短いプログラムならそれでもいいけどね。

初心者からFRPのことまで考えてないんだろう。

関数型のわかりやす説明であって、住井派に反対してるとか、岡部路線とかじゃないよね、と。

2016-05-22

http://anond.hatelabo.jp/20160520083417

「滅多なことが言えなくなった」としたら、nonstarter氏のブログのように

岡部氏に反する意見を言うと激しく荒らされるからですね。

迷惑がかかるといけないのでリンクしませんが、

住井氏は関数型言語に関する世界最高峰の国際会議委員長ですね。

エリオット氏のブログは、岡部氏が引用していない部分を読むと、

C言語の「プリプロセッサが」Cプログラムを「生成する」ので、

HaskellのIOモナドがIOアクションを生成するのと同様に

純粋関数型言語とみなせる、という主旨のことが書かれていますね。

岡部氏は「プリプロセッサ」という部分を引用していないようですが。

2016-05-20

http://anond.hatelabo.jp/20160520153456

OCamlでは」普通に副作用を使うライブラリしかいかスケールしない、って書いてあるのに

なんで勝手一般化して、Haskellとかでもスケールしないことにしたいの? 本当に牽強付会オンパレードですね。

http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-d9a8cdf2efc67044c158

OCaml の全ての GUI ライブラリ状態副作用を使うことを前提にメインループ設計されているからです。これを乗り越えるとすると @Lambada さんのようにメインループ自体自分で書く事になり、一般的にはスケールしません。HaskellGUI ライブラリでは普通状態State なり IO を含む GUI モナドを使って書く事になりますが、そのような GUI ライブラリOCaml 上で作れば同じような事が出来るはずです。OCaml でそこまで純粋関数型のコードを書く事に実用意味があるとは思えませんが。

http://anond.hatelabo.jp/20160520135548

一応説明すると、Elliottの元記事

HaskellのIOモナドが「IOアクションを生成する純粋関数プログラム」なのと同様、

Cのプリプロセッサは「Cプログラムを生成する純粋関数プログラム」って言ってるのね。

から「cpp + C言語処理系」は「Haskell + 処理系」と同じく純粋関数型だと:-)

http://anond.hatelabo.jp/20160520052648

http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-d9a8cdf2efc67044c158

いずれにせよ、状態機械数学構成では状態遷移が状態入力から状態への関数として表現されるというだけのことではあり(状態渡し)、

状態遷移が複雑になれば状態遷移を純粋関数として表現する作業も複雑になり困難になるので(そしてそれはしばしば綺麗な関数合成では上手くいかないようなものになることが多いので)

って自分で(状態渡し)は困難になる、「状態渡しはスケールしない」って認めちゃってるんだが、

モナドと一緒ってことにして、Haskellモナドの話にすり替えたいってことなのかな?

状態渡しはスケールしない」とこの人物が自分で認めてることは消えないよね?

http://anond.hatelabo.jp/20160518170332

これのどこをどう読んだら「状態渡しはスケールしない」になるんだ……

ひょっとして状態渡しをモナド化したのがStateとか、基本的なことを全く理解していない?

http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-d9a8cdf2efc67044c158

OCaml の全ての GUI ライブラリ状態副作用を使うことを前提にメインループ設計されているからです。これを乗り越えるとすると @Lambada さんのようにメインループ自体自分で書く事になり、一般的にはスケールしません。HaskellGUI ライブラリでは普通状態State なり IO を含む GUI モナドを使って書く事になりますが、そのような GUI ライブラリOCaml 上で作れば同じような事が出来るはずです。OCaml でそこまで純粋関数型のコードを書く事に実用意味があるとは思えませんが。」

2016-05-17

http://anond.hatelabo.jp/20160517022608

>それをユーザから見て命令変数への破壊的代入ではなく参照透明な関数インターフェースで実現するのがいわゆるモナドや(誰かの独自解釈ではない本来の)FRP

はい、戯れ言への反論がkenokabeよりBlogでされました。

http://kenokabe-techwriting.blogspot.jp/2016/05/frp.html

http://anond.hatelabo.jp/20160516152330

それをユーザから見て命令変数への破壊的代入ではなく

参照透明な関数インターフェースで実現するのが

いわゆるモナドや(誰かの独自解釈ではない本来の)FRP

http://elm-lang.org/examples/time

view : Model -> Html Msg
view model =
  let
    angle =
      turns (Time.inMinutes model)

    handX =
      toString (50 + 40 * cos angle)

    handY =
      toString (50 + 40 * sin angle)
  in
    svg [ viewBox "0 0 100 100", width "300px" ]
      [ circle [ cx "50", cy "50", r "45", fill "#0B79CE" ] []
      , line [ x1 "50", y1 "50", x2 handX, y2 handY, stroke "#023963" ] []
      ]

HaskellライブラリもElmのような言語も、サンプルもJavaScript実装

ググればWikipediaで出てくるレベル

https://en.wikipedia.org/wiki/Functional_reactive_programming#Implementations

2016-01-27

ええ、最初は軽い気持ちだったんです。

ええ、最初は軽い気持ちだったんです。型もなくて簡単だからって…。phpをやるようになって から確かに気分は良かったんですよね。

でもそのうちphpだけじゃ足りなくなってくるんですよ。javascriptのような流行ものにも手を出したりして。そうするとcsshtmlだけなんかじゃもう物足りないんですよ。

そのうちpythonrubyなんていういわゆる”スクリプト系”ですか?流行のものにはほとんど手を出してしまっている状態で。コストが安いじゃないですか?手を出しやすいんですよね。

node.jp?やってましたね。あの頃みんなハマってましたよね。

だんだんそれらなしでは生活できなくなってしまって。立ち上げているのはほとんどCUI画面ですよね。

ええ、端末一つでは足りないのでtmuxscreenなんかのマルチプレクサを使ったりしてね、もう完全に中毒症状が出ていたんですよね。vimrcをいじるようにもなっていてね。一日中vimscript書いては悦に浸って、考えるとちょっとあれですよね。

そのころはいつでもやめられると思っていたんですよ。

でもjavac#に手を出してしまったんです。phpとかrubyなんかよりはやっぱり重量感がありますよね。IDEも何個も試してみたり、vimだけで環境を整えようとしたり、結構無茶しましたよね。

テストもいっぱい書いて、なんでこんな辛いことしてるんだろうとか。

そして、みんなそうなんのかもしれないけど、やっぱりc++に手を出すことになってしまって。もう強すぎて今までのものとは全然違いますよね。でもこの頃には副作用も出ていたんです。

あれオブジェクト指向ってなんだっけってね(笑)テンプレートリフレクション?混乱しますよね。でもだんだん慣れてくるですよね。もう後戻りできないところまで来ちゃったかなとか思いますよね。

今では中毒症状のせいか幻聴も聞こえてますね。モナドモナドって。なんか良くわからない言葉が聞こえてます

抜けられる自信は無いですね…。今でも一日に10時間以上はやっていますから…。

2015-02-26

関数型言語使ってる時の気持ちよさは、ベーシックべた書きの頃と同じ

ひょっとすると、これはべたべたな一直線の手続き書き時代以来の「全てが一直線に並ぶ気持ちよさ」なのかもなぁ、と思った。

Haskellなんかを書いてると、究極的に、関数型言語におけるプログラムとは、一引数関数の深い深い一直線の入れ子みたいに感じられる。

(いやまぁ、タプルとかもあるけど、原則的に)

構造化⇒OOPと来て、プログラミング言語Go to hellを廃し、色んな物をDRYに書けるように進化してきたけど、その結果色々なものが並列にばらばらっと並んでいる感じになった。

OOP大本smalltalkメッセージパッシング原則の時点で、対等な二つの並列に並んだオブジェクトのやりとりがベースになっている。

勿論オブジェクトは大体内部に別のオブジェクトを抱えていたりして、親子関係があるのは普通だけれど、子同士はやはり並列に順序なく並んでいる。

この並列性のおかげで、例えばそれこそメッセージパッシングをそのまま引き継ぐErlangなんかは、高いスケーラビリティと耐久性を持つわけで、これ自体は素晴らしい発明だ。

ただ、やっぱり並列なヤツラが、ごちゃごちゃっと同時にあって、そいつらが同時にガチャガチャなんかやってたら、神の見えざる手的に、なんとなく全てが上手く噛み合って、プログラムが動きます、って、これどうしても全体像を把握しにくい。

人間脳みそって、そんな同時並列のものを把握できるようには、出来ていないんだと思う。

上手く動いてはいるんだけど、何で上手く行ってるのか分かるんだけど、分かりにくい。

この気持ち悪さが、今日もどこかのITおじさんを全部staticな書き方に走らせ、OOPわかんねー、と首をかしげながら、何となく使ってる人達の心を、巨大なメソッド作りに導いているのではないかな、と。

なんてったって、Scalaなら並列処理でさえ、モナドなFutureで事実上直線に繋いでいってかいちゃう(Akkaもあるけどあれはオブジェクティブな側面なので)わけで、これは凄く懐かし気持ちいいと思う。

かくして関数型言語は「なんかとにかくきもちいいぃぃぃぃ」な信者を量産している。そしてOOP派との間に、意味分からん溝だけが広がっていく。

2014-10-09

Haskellerが嫌い

Haskellerが嫌い

Haskellはきらいじゃないけど

Haskellerのあの偉そうな感じが受け付けない

Haskell先進的だからだろう

自分

Haskellが好きです」

って言って

相手に

「え? まだそれ? 面白いの?」

って言われないと確信しているあの感じ

しろ言語ユーザ自分よりフィロソフィーが足りないと思ってそうなあの感じな

普通は尖った言語なんて使ってたらそうなっちゃもの

先進的な言語を使うこと自体が悪いわけではないけど、

Haskell好きだけはここ十年くらいプログラミング言語DISを受けていないから結果的に奴らは増長しているのだ

しろHaskellを使っていることがなんかステータスになると思っているのだ

これからは目を爛々と輝かせたHaskellerに上から目線

Haskellが好きです」

と言われたら

「あーIOモナド副作用じゃないよ詐欺言語だよねー」

と返事を返すことにしよう

そうしようじゃないか!

http://anond.hatelabo.jp/20141009194334

2014-07-17

関数型入門以前

これ読んでも関数型分からないけど、入り口の前あたりに立つために

関数型言語覚えたらなんの役に立つの

プログラマとしての引き出しが増える。

って書くと「そんなもんどんなプログラミングテクニックだって一緒だわ」って言われそうだけど、でもそうとしか言い様がない。

とりあえず、オブジェクト指向と同じで、プログラム構造化して、複数レイヤーに切り分けて部品化していくテクニックだとは言える。

ただオブジェクト指向とは大分切り口が違う。何ていうか、割と直交する切り口でプログラム構造を切り分けていく。

なので、関数型とオブジェクト指向と両方憶えるだけで、大分切り口の引き出しが増える。

オブジェクト指向関数型両方憶えると、プログラマとしての引き出し増やすのに効率が良い、って思えば良いかも。

具体的にどう切り分け方が違うの?

オブジェクト指向は、プログラムの各部品を「あれの中のこれの中のそれの中にあるあれ」みたいな感じで組み合わせる。

部品が更に細かい別の各部品で構成されていて、それぞれの部品が噛み合わさって、複雑な一つのプログラムを構成するような切り方。

関数型言語は、プログラム部品を「あれをした物にこれをした物にそれをした物にあれをする」みたいな感じで組み合わせる。

もっというとプログラム全体を簡単に記述するできるDSLがあって、そのDSLを簡単に実装するためのDSLがあって、DSLの入れ子構造で一番小さい部品シンプル関数、みたいな切り方。

どう使い分けたら良いの?

ケースバイケース。

ではあるんだけれど、シンプル部品を大量に組み合わせて構成するのがしっくりくるならオブジェクトで、部品数が少ないんだけど一個一個が複雑な動作する構成にしっくりくるのが関数型……かも?

関数型言語の紹介見てると、何かひたすらイミュータブルなデータを弄繰り回す説明ばっかり出てくるんだけど…

関数型言語たる条件として「関数が第一級オブジェクト」ってのがあるんだけど、関数が第一級オブジェクトだとイミュータブルなデータを素直に扱える。

で、イミュータブルなデータ構造使うと色々便利、ってことで実例として一番出てくるという。

何か型型言ってるんだけど、型くらいC言語にすらあるわ。メモリ領域の確保量を示すあれが何でそんなに重要なの?

関数型言語エポックメイキング的な言語が三つくらいあって、元祖Lispとその流れ汲んだMLMLの一種で関数型をある種の到達点に持っていったHaskellって感じ(独断偏見)。

で、このうちのMLって奴が、プログラミング言語に型システムがついてるんじゃなくて、型システムプログラミング言語がついてきた存在だったりする。

型で色々やるために生まれたわけで、まぁなんというかそもそも型と密接な関係にあって、Haskellもその流れを汲んでて、こいつが超有名になった、って感じ。

おかげさまで、型使って色々やったりする方法が日々考えられているわけです、静的型付関数型の世界では。

クロージャって、大まかな概念wikiとかで理解したけど、関数型でどう使われてるの?

関数型言語ではよく「関数関数を引き取って、合成した関数を返す関数」みたいなのが使われるんだけど、関数関数の合成って、それ合成された関数がもともと引数として与えられていた関数憶えてないと無理やん? 自分自身の構成部品憶えてられないわけだから

クロージャあると憶えててくれるわけですよ。

そんな感じで高階関数実用的なレベルで使うのには大体必須と言う。

モナドとやらは何に使うものなの? 何が便利なん?

関数型言語DSLを作りまくる言語みたいに書いたけど、モナドちょっと複雑なDSLを簡単に作らせてくれる仕組みだと思っとけば良い。

Haskell副作用が一切ない純粋関数型言語って言うけど、副作用なしでどうやって入出力してるの?

まず純粋定義だけど「全ての関数は同じ引数を与えられた際、必ず同じ値を返す」ってことで、これがいわゆる副作用がないって状態だ。

で、これって逆に言えば「プログラムである関数に対して、絶対に同じ引数を与えさえしなければ、その関数がどんな値を返したところで、事実上純粋だと言えてしまう」ってことでもある。

本末転倒感があるんだけど、HaskellではIOモナドという仕組みと特別main関数を使って「呼び出すたびに絶対に違う引数自動的関数に与えてくれる仕組み」を実現していて、こいつを使って入出力する。

うん……凄い本末転倒。ちなみにこの自動的に与えられる引数はRealWorldって名前がついていて、要は「刻一刻と変わり続け絶対に同じ状況にならない現実世界の状態を引数に取っちまっているようなもんだからしょうがないだろ?」的な感じ。

2014-06-19

http://anond.hatelabo.jp/20140619010953

純粋なrandom関数は、引数に渡したseed値に対して、同じseedには必ず同じ値を返す。

一つ前の乱数を再びseedにするやり方で、いくつもの乱数純粋に取り出せるよ。

もちろん初期値が一緒なら、起動するたびに同じ答えが返るけど。

で、初期値を起動するたびに変えたいってのを純粋にやるなら、IOモナド使うことになる。

手続き系とFPどっちのが分かりやすくなるかは、ケースバイケースだから使い分けろ、ってのは正しい。

追記:

ってよく見ると、ランダム値列の作り方じゃなくて、あくまでどうやって返す関数書くか、ってことか。

それならIOモナド使うまでもないので、自分的に書きやすScalafp形式で書いてしまうけど

val rands = Seq(10,20,1,6,8,0,0,0,20,10)

def f(xs: Seq[Int]) = xs.slice(0, xs.scanLeft(0){_ + _} takeWhile {_ <= 50} size)

f(rands)

でいけると思う。

2014-05-15

未来の為の寛容さ

関数本と称したデタラメ本なんかどれだけ高く平積みしたところで、どうでもいいと思ってるよ。間違って買っちゃった初心者右往左往するだろうが、きっといつかは正しい知識に戻ってくるだろうし、それで諦めちゃう人はどのみち辞める定めなんだろう。たとえQiitaとかで議論を吹っかけられようと、話し合いが成立しないと判った時点で席を立てばいい。煽られようとワザワザ付き合ってやる必要はない。でも実際のお前らは腹を立て、戦い、傷ついてPTSDになって、数スレを消費した。そんなナイーブなお前らが、今回の事件は何故かスルーできた。

悪意のカタマリだろうと、他愛のない道化はむしろ放置でいいと思うんだよ。色んな奴がもっと好き勝手に書くべきだ。ちゅーんさんはモナド本を書いていいし、漫画解説する関数型があっていいし、遅延評価解説本は望まれている。市井プログラマー素人技術本を書いていいんだ。関数型プログラミング繁栄はそういう態度の先にあると思う。選択肢は多い方がいい。その中で、何が本当に重要かは読者が決める。ヘンテコリンな奴をありのまま受け入れる寛容さは必要だと思うんだ。

でも今回のはそれに収まらない。重要さのレベルが違うだろ。どこぞの馬の骨じゃない。あの子日本Haskellコミュニティの若手ホープじゃないか。今は女性関係で腹を立てているだけかもしれないが、将来トップに立った彼に「あなたライブラリは負の価値しか持ちません」っつって包丁画像突きつけられたらどうする。Slackでは「勉強会に参加する学生が少ない」とか嘆かれてたけど、俺が学生なら、もはや頼まれても行きたくない彼女言及しなければ安全? 俺はそんな風には全然思えないし、正直不安だよ。



…いや、だからどうしろって言う意見はない。どうすればいいかは判らない。お前らの冷静さにビックリしたというのが感想だ。他人が頭ごなしに言っても伝わらないだろうし、本当に必要なのは排斥することじゃなくて、自分の考えを親身になって聞いてくれる仲間だと思う。ただ正論ねじ伏せるのでなく、それでいて「単なる腰抜け」じゃない誰か。

彼はスレ民でもあった筈だが、ム板のこのスレはそういう話に適さないだろう。俺たちが場を提供することはできない。勝手だが身内に期待したい。圏論の話ならいつでも歓迎です。

以上、スレ汚し済まなかった。コードポイントフリーにする作業(たのしい)に戻ります

--------------------------

この文章は当初2ちゃんねるプログラムHaskellスレに投げる予定だったが、スレ汚しになると判っていて書くのもどうかと思い、失礼してこちらに置きました。あとリツーイータビリティ。(この記事リンクフリーです)

2014-04-22

http://anond.hatelabo.jp/20140410183410

すごい今更だけど、1に対してだけ少し。

基本的に、まだ発展途上にあるものほど、理論面が強調されがちなんだと思う。

今の関数型言語は、まだデザインパターンが、色々発案されだしているけど、確立しきっていなかった頃のJavaオブジェクト指向時代、みたいな感じ。

Javaで言うデザパタは、関数型言語では大体、モナドとしてまとめられるわけだけれど、そのモナドを色々発明するために、圏論をしっておくに越したことはない、みたいな感じなんじゃないかと。

もっとも、そろそろすでに出てきているデザパタモナドを利用するだけの、純粋学習者も増え始めている頃合だから、気になりだしては来るタイミングなんだろうけど。

2014-04-10

プログラム中級者が感じる関数型の違和感

なんだか話題になってるから書く。

やっと初心者を脱して中級者になりかけてるプログラミング学習者が関数型言語に何を感じているかを書こうと思う。

1 圏論かいらないんじゃないの?

Haskellが短いコードプログラムを書けるというのは分かる。

forループmapやfoldで抽象化する利点も分かる。

それでやりたい処理のほぼ全てがまかなえるということも実感している。

副作用のない小さな関数を合成して大きな関数を作る利点も分かる。

再利用性も上がるし、どこからどう影響を受けているかが簡単に分かるからバグも出にくい。

ただ、Haskellの基礎になってる圏論が何の役に立つのかは、まったく分からない。

むしろ邪魔なんじゃないかと思う。

ファンクターやモナド概念圏論で扱われているのは分かるけど、圏論なんて名前だけ知ってればコードを書くのに不都合はないだろう。

圏論必要なのはHaskell設計する人であって、使う人ではないと思う。

なのに、やれクライスリ圏だ自己関手の圏だのと、うるさいったらありゃしない。

Linux上で開発環境整えるのにカーネルコードを読めって言うぐらい的外れだと思う。

いや、知識として持っとくのはいいだろうけど、役に立たんだろ。

2 言うほど新しい機能ないような?

Rubyが羊の皮をかぶったLispとはよく言われることだけど、関数型言語オブジェクト指向言語とそこまで違いがあるような気がしない。

純粋言語ではできないけど、クロージャに内部状態を保持してもらって無名オブジェクトみたいな使い方をすることはあると思う。

その無名オブジェクトもっとあれこれデータ関数詰め込めば、いつの間にか普通にJavaC#で使うようなクラスのできあがり。

その間はなめらかにつながっていて、不連続に切れるようなもんじゃない。

関数プログラミングと言いつつ、オブジェクト指向の考え方は利用できる。

上級者はデザインパターンdisるのが好きかもしれないけど、逆の考え方をするべきだと思う。

デザインパターンオブジェクト指向言語欠点を補うための苦肉の策じゃないよ。

関数プログラミングの基礎的なパーツだと思う。

からちょっと見た目がすっきりするだけで、結局やることはオブジェクトプログラミングと変わりはないと思う。

3 なんか選民思想にとらわれて無い?

関数プログラミングコミュニティの人って、業務でクソコードメンテさせられて、その現実逃避に美しいコードに擦り寄っているように見える。

もちろん、美しいコードを書けるなら書いた方がいいし、現代的な言語を使えるなら使ったほうがいいと思う。

けど、適材適所というか、オブジェクト指向言語でも、やってやれないことはないわけで。

役に立たない圏論をありがたがる所とか、どうもイキがってるように見える。

せいぜい生産性が倍になる程度で、他の要素が悪ければ帳消しになるような利点でしかないに違いないのに。

開発プロセスとかを見直す方が仕事を楽にしてくれるんじゃないのかな?

http://anond.hatelabo.jp/20140410134501

id:minamiyama1994 さん、反論してくださってありがとうございます

Haskellファンのご意見がいただけて嬉しいです。元増田です。

記事全体で「関数型言語」と呼ばれているものは「関数型言語一般」ではなく「Haskellや一部OCamlの話題を含むごくごく一部の言語」の話である

わかりにくくてすいません。記事では「関数型言語」の話はしていません。「関数型プログラミング」の話をしました。

関数型言語」は範囲がよりボンヤリとした表現です。たとえばC言語関数型言語かどうかをみても賛否両論にわかれるでしょう。

私が記事を書いた目的は、”関数型プログラミングに縁のない人に関数型プログラミングをわかりやすく紹介したい”でした。

その目的のため、「関数型言語」という表記を注意深くとり除き、代わりに「関数型プログラミングサポートした言語」という言い方をしています

このスタンスの上で、

関数型プログラミングをフルにサポートした言語”の代表として、Haskellを紹介し、

関数型プログラミングへのサポート片手落ち言語”として、LispErlangなどを扱いました(それらのファンの皆、ごめんなさい)。

言語パラダイムの話題」と「言語の話題」と「ライブラリの話題」と... を混同している

関数型プログラミング初心者の方は、それらの差異なんてどうでもよい、と考えるのではないでしょうか。

関数型プログラミングとは何が良いのか、を大雑把に知りたい。

そうなのではと考えて、あえて区別せずに記事を書きました。

「たとえばモナドを知っていれば、30分程度でパーサー(解析機)を理解することができて」? モナドはそんな限定的用途のものではないし、パーサの理解とは無関係だ(単にライブラリ設計の問題)。それにApplicativeスタイルのほうがパーサが書きやすいという人もいるだろう

id:minamiyama1994 さんの仰るとおり、モナドはパーサー以外の多くの応用があります

現状多くのパーサーがモナディックパーサーとして書かれていますモナディックでないパーサーは、あまり多くのユーザーには使われないでしょう。

モナドなどの抽象的な構造が幅を利かせてるお陰で、ライブラリに秩序が生まれ、ユーザーはそれを使いやすく・読みやすくなっている、というのが私の言いたかった主張です。

(なお細かいことで恐縮ですが、ある種のモナディックパーサーはApplicativeでは書けません。その点をお忘れですよ)

テキスト処理」に対して

お前それShellやPerlRubyPythonの前でも言えるの?

GUI」に対して

GUIライブラリ設計にもよるけど、GUIってOOPの強い分野だと認識していたのだけれど、さてはて

この二つは、先人が不利な環境ですごく頑張った成果が現状なのだ、と思っています

本質的には関数型プログラミングの強みが活かせる分野のはずです。

「個人の技量の話題」

レシピ」に関しては、関数型プログラミングスタイルでは、手続きを手続きとして自然表現できるのに対し、オブジェクト指向ではできない(DSLチックなものになってしまう)、ということを言いたかったのですが、

わかりにくかったですね。

「書きやすい」

(*)関数の例で、関数型プログラミング無駄の無さを示せた、と思ったのですが…

僕自身はC++Haskellの両方を書く人間で、確かにC++の方が「短く書ける」と「感じる」ことは多い

マヂですか…反論のためのでっち上げとかじゃなくて(失礼)?(追記: Haskellの方が「短く書ける」、のタイポだそうです)

記事そのもの価値基本的にないっぽい、こういう記事撲滅されないかなぁ

Haskell布教のために有休とって4時間かけて書いたのにーw

撲滅…

ショボーン(´・ω・`)

アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん