非純粋関数型言語の純粋関数と純粋関数型言語メモ(正しさハラスメントとカモ)

後編の上部に前編のさらに前提になっている会話があるのでそちらから見てもらうのもよいかも。 後編はいろいろな展開があり興味深いです。 https://togetter.com/li/1812032
2
加藤潤一(かとじゅん) @j5ik2o

純粋であることや関数型であることが必ずしも「純粋関数型言語であること」にはならないかな。仮にそうならないならすでにHaskellがマジョリティになってるだろうし。まあ個人的に好きですが。とはいえ局所的に純粋関数的であればよいこともあるしそもそも言語の選定は他の条件にも左右されますよね twitter.com/cubbit2/status…

2021-12-04 10:38:10
Cubbit @cubbit2

関数の純粋性の大切さを強調したり関数型プログラミングの有用性を声高に説くわりに、純粋関数型言語を使うのだけは頑なに拒む人たち、なぜなのか

2021-12-04 01:44:48
ABAB↑↓BA @ababupdownba

人は極端が怖いんだろうな 退路を用意したいと言うか 何度か言ってるけど、想像での批判は楽だと思うけど 純粋ではない関数型言語を入れたときの気持ちを思い出して、純粋関数型プログラミング言語を内部向けツールで良いから使ってみてほしい たぶん視界が変わるから

2021-12-04 13:05:26
r.ishibashi @cactaceae

いつものあれだ。 「何かを薦めるために何かを貶めるべきではない。」

2021-12-04 13:24:03
Cubbit @cubbit2

@cactaceae どういうことですか?????

2021-12-04 13:31:45
r.ishibashi @cactaceae

@cubbit2 不快な気持ちにさせてしまってすいません。 ああいうツイートはすべきでは無かったと思い返しました。

2021-12-04 14:09:36
Cubbit @cubbit2

@cactaceae いえ、不快だとまで思っていませんが、そのリンク先のその文を引用して、どういうことを言いたかったのかなと単純に思いまして

2021-12-04 14:14:12
r.ishibashi @cactaceae

@cubbit2 丁寧にありがとうございます。 簡素な説明になりますが、Monadの扱い方によっては純粋関数のメリットを失うことは簡単におきて、それは処理系でもどうにもしてくれないという事を伝えたかったです。

2021-12-04 14:20:23
Cubbit @cubbit2

@cactaceae モナドの使い方によっては純粋関数のメリットが失われる……????? たとえばどんな使い方のことなんでしょう……?????

2021-12-04 14:33:00
r.ishibashi @cactaceae

@cubbit2 Haskellのコードの中で純粋関数ではない関数かけますか?

2021-12-04 14:38:46
Cubbit @cubbit2

@cactaceae もちろんunsafePerformIO を使えば書けますが、 そういう話ではなくてですか?????

2021-12-04 14:41:22
r.ishibashi @cactaceae

@cubbit2 Haskell詳しくないので間違ってたら申し訳ないんですが、unsafePerformIOをつかなくても、Monadを返す関数が作れればその関数は純粋関数ではないという認識ですが、間違ってる部分があれば教えてください。

2021-12-04 14:53:58
Cubbit @cubbit2

@cactaceae それはモナドに対する典型的な誤解ですね モナドとはbindとpureという2つの純粋な関数の組で、これらの純粋な関数をどう組み合わせても、もちろん純粋です たとえば、標準出力で使う関数 putStrLn は IO () を返しますが、このputStrLn は間違いなく純粋な関数です hackage.haskell.org/package/base-4…

2021-12-04 15:02:33
Cubbit @cubbit2

@cactaceae あー、わかりました >純粋関数型はすべての関数で 副作用 を許しません。つまり、Haskell はコンソール、データベース、他システム等とやりとりすることはできません。...というのは嘘で この「嘘」は後半の「データベースを使えない」を指してて、前半の「純粋関数型~副作用を許さない」は本当です

2021-12-04 15:09:45
Cubbit @cubbit2

@cactaceae 「モナドとはbindとpureという2つの純粋な関数の組」はちょっと微妙な表現だったかもです…… モナドとは、型構築子Mと、モナド則を満たすbind とpureという関数からなる3つ組、というのがHaskellでのモナドの通常の定義です 詳しくは入門書を参照して頂ければ

2021-12-04 15:30:36
r.ishibashi @cactaceae

@cubbit2 副作用を含むMonad実装の話をしていたら副作用を含まないMonadの定義の話になったような? 純粋関数であっても副作用に依存した純粋関数って嬉しいんでしたっけ?

2021-12-04 15:56:46
Cubbit @cubbit2

@cactaceae IO aを返している関数は、そうする必要があるからIO aを返しているので、それは嬉しいとか嬉しくないとかではないと思います もちろん add x y = pure (x + y) のように無意味にpureを絡めるような関数は定義できますが、そんなことはわざわざ狙って書かない限りは起きないです

2021-12-04 16:04:31
r.ishibashi @cactaceae

@cubbit2 実際のある程度大きなプロジェクトで純数関数型のライブラリを使っていましたが、意識して書き分ける必要があり、教育が必要でした。 副作用に依存する純粋関数だらけになると純粋関数であるメリットは無くなります。

2021-12-04 16:24:13
r.ishibashi @cactaceae

@cubbit2 逆に、副作用に依存していない事が保障されていればMonadだらけでも純粋関数のメリットは活かせます。

2021-12-04 16:28:38
Cubbit @cubbit2

@cactaceae 純粋関数型言語でない言語では、純数関数型のライブラリを使っても、副作用を意識して書き分ける必要があるのは、その通りです なので、それを意識して書き分けなくても関数の純粋性が保証され、作用が自然に型で表現される純粋関数型言語を使ったほうがいい、という話が最初のツイートなのですが……

2021-12-04 16:40:06
r.ishibashi @cactaceae

@cubbit2 関数の純粋性が保障されていても副作用に依存した純粋関数が作れてしまうのでそうなると意味がないです。 それはHaskellでも同じです。

2021-12-04 16:41:59
Cubbit @cubbit2

@cactaceae 「副作用に依存した純粋関数」って何のことですか? IO aを返す関数のことでしょうか? 正確な表現でないと、何を言っているのかわからないのですが…… 「HaskellではIO aを返す関数を作れてしまうので意味がない」っていうことですか?

2021-12-04 16:45:11
r.ishibashi @cactaceae

@cubbit2 先に純粋関数のメリットを合意した方が良いかも?

2021-12-04 16:47:16
Cubbit @cubbit2

@cactaceae いえ、その前に「副作用に依存した純粋関数」とは何を指しているのか、cactaceaeさんの現在の解釈で構わないのでおしえてください

2021-12-04 16:49:08
r.ishibashi @cactaceae

@cubbit2 では一旦その前にCubbitさんの純粋関数の定義を確認させてもらえますか?

2021-12-04 16:51:51