関数型プログラミング言語 Haskell について語るスレです。
Haskell Language(公式サイト)
https://www.haskell.org/
日本Haskellユーザーグループ - Haskell-jp
https://haskell.jp/
前スレ
関数型プログラミング言語Haskell Part32
https://mevius.5ch.net/test/read.cgi/tech/1548720347/
探検
関数型プログラミング言語Haskell Part33
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/02/10(月) 18:17:36.49ID:L6eYQqyh330デフォルトの名無しさん
2020/05/24(日) 19:39:02.80ID:A0PpU4F1 HaskellのフレームワークってGHC拡張たくさん使われてるから、基本的な文法だけ知ってても、エラーが出たら意味分からなくなるという初心者泣かせな言語だな。地道にコツコツ知らないことを勉強してってるわ。
使いこなしてる人ホンマ羨ましい。
使いこなしてる人ホンマ羨ましい。
331デフォルトの名無しさん
2020/05/24(日) 22:41:15.23ID:oexHBYog The state of GHC on ARM
https://www.haskell.org/ghc/blog/20200515-ghc-on-arm.html
https://www.haskell.org/ghc/blog/20200515-ghc-on-arm.html
332デフォルトの名無しさん
2020/05/25(月) 14:19:28.47ID:HRWjfAZ+333デフォルトの名無しさん
2020/05/25(月) 19:07:59.38ID:b4izxg0D むしろ俺は段階的に学べていいと思ったが
334デフォルトの名無しさん
2020/05/26(火) 13:27:47.52ID:w7oGlmub haskellのフレームワークとやらが具体的に何を指しているのか分からん。
YesodやServantなどのWebフレームワークしか思いつかんが。
いずれにしても、そもそも初心者がフレームワークに頼るべきではない。
初心者を抜けて、さぁ本格的なアプリでも作ってみるかとなった時に使えばいい。
初心者は15パズルやTODOツールみたいな簡単なアプリをフルスクラッチで作ってみて、
言語拡張の必要性や、有用なライブラリの使い方を少しずつ学ぶことを奨める。
YesodやServantなどのWebフレームワークしか思いつかんが。
いずれにしても、そもそも初心者がフレームワークに頼るべきではない。
初心者を抜けて、さぁ本格的なアプリでも作ってみるかとなった時に使えばいい。
初心者は15パズルやTODOツールみたいな簡単なアプリをフルスクラッチで作ってみて、
言語拡張の必要性や、有用なライブラリの使い方を少しずつ学ぶことを奨める。
335デフォルトの名無しさん
2020/05/27(水) 11:14:49.47ID:xJStjlCD そういうのはつまらんのだよ
336デフォルトの名無しさん
2020/05/27(水) 13:16:13.81ID:SIsgBJ88337デフォルトの名無しさん
2020/05/27(水) 17:32:08.93ID:Ro2X8Fae プロジェクトオイラーでもやったら
338デフォルトの名無しさん
2020/05/29(金) 00:14:38.34ID:Hx2r4buk haskell興味あるのですがhaskellの長所と短所ってなんですかる
339デフォルトの名無しさん
2020/05/29(金) 00:57:51.48 若さと情熱に身を任せたいなら C、衰えても続けたいなら Haskell
340デフォルトの名無しさん
2020/05/29(金) 07:22:48.07ID:mJaFRwIH GoとRustが無かった時代には長所がいっぱいあったんだろう
もし、その時代のコードを変更することなく今使えるならそれも長所だが
もし、その時代のコードを変更することなく今使えるならそれも長所だが
341デフォルトの名無しさん
2020/05/29(金) 07:54:35.82ID:7l9AMad4 >>338
長所は難しいことをより難しく書けること
短所は簡単なことでも難しく書かざるを得ないこと
本質的に純粋関数だけじゃリリースできないことも大問題ではある
切り分けで対処しても破壊を含むコードは必ず走る
理想が現実に敗北したような体系だから手を出さないほうがいいよ
長所は難しいことをより難しく書けること
短所は簡単なことでも難しく書かざるを得ないこと
本質的に純粋関数だけじゃリリースできないことも大問題ではある
切り分けで対処しても破壊を含むコードは必ず走る
理想が現実に敗北したような体系だから手を出さないほうがいいよ
342デフォルトの名無しさん
2020/05/29(金) 08:30:23.80ID:wwuYcwOw >>338
長所は、宣言的に分かりやすく書いたプログラムが意図通りにちゃんと動くことです。
何をするのかと、どのようにするのか、この二者をきっちり分けてプログラムできるのがHaskellの大きな魅力です。
(できると言っても、初心者が簡単にできることではありません。 その方向に正しく精進する必要があります。)
短所は、少し上のレスでも言及されていますが、入門を抜けた後に何に取り組めば良いのか分からなくなることです。
始めから何か目的があってHaskellを学び始めたのでしたら良いのですが、そうでなければ、
魅力的な題材の無さに愕然とし、路頭に迷うことになるでしょう。
実はgithub等を漁れば先輩方の様々はジャンルの非常に参考になるプログラムを数多く拝見でき、
自分も取り組んでみたくなる題材がたくさん見つかるのですが、逆に言えばそうやって努力して探さないと見つかりません。
長所は、宣言的に分かりやすく書いたプログラムが意図通りにちゃんと動くことです。
何をするのかと、どのようにするのか、この二者をきっちり分けてプログラムできるのがHaskellの大きな魅力です。
(できると言っても、初心者が簡単にできることではありません。 その方向に正しく精進する必要があります。)
短所は、少し上のレスでも言及されていますが、入門を抜けた後に何に取り組めば良いのか分からなくなることです。
始めから何か目的があってHaskellを学び始めたのでしたら良いのですが、そうでなければ、
魅力的な題材の無さに愕然とし、路頭に迷うことになるでしょう。
実はgithub等を漁れば先輩方の様々はジャンルの非常に参考になるプログラムを数多く拝見でき、
自分も取り組んでみたくなる題材がたくさん見つかるのですが、逆に言えばそうやって努力して探さないと見つかりません。
343デフォルトの名無しさん
2020/05/29(金) 09:57:17.22ID:zRWEM9Qa344デフォルトの名無しさん
2020/05/29(金) 10:24:25.66ID:mJaFRwIH 過激派と思ってた奴に中道の仕事を奪われる
理論的にありえないと思っていた中道と中道の対立が現実になる
理論的にありえないと思っていた中道と中道の対立が現実になる
345デフォルトの名無しさん
2020/05/29(金) 11:22:41.66ID:xO3kN7Ry どんなに多くの短所があろうが
それらに勝る長所が一つあれば好きになる
人でもプログラミング言語でも
それらに勝る長所が一つあれば好きになる
人でもプログラミング言語でも
346デフォルトの名無しさん
2020/05/29(金) 11:35:07.26ID:OBuVVMWP >>338
Haskellに対して懐疑的だった初学者がParsec使ってパーサー書いてみた感じだと
長所
バグ皆無のパーサーをBNFを書き写すように簡潔に書ける
(自分はCやrubyでは書けなかった)
問題に応じて言語内言語を作れるので、コードの量を極めて少なくできる
短所
yaccやbisonより学ぶのにかなり時間がかかりそう
言語内言語を作れてしまうので、ぱっと見ただけではコードを理解できない
(数式を理解するには記号の意味を理解している必要があるのと同じ)
yaccやbisonを使った経験は無い
だが、Haskellの方が応用が利き問題の解決の仕方が美しいので学びたいとは思わなくなった
解決したい具体的な問題があり、自分が学んできた言語だとコードが大きく複雑になりそうで、新しい概念を学ぶ余裕と覚悟があるなら良いと思う
ただ便利そうなのを探してるとか興味があるってだけだと挫折するかも
Haskellを参考にしたより新しい言語を学ぶ方がスマートかもしれない
自分みたいにHaskellに懐疑的で徹底的に学んで悪口書いてやろうと思っているならマジお勧めwww
Haskellに対して懐疑的だった初学者がParsec使ってパーサー書いてみた感じだと
長所
バグ皆無のパーサーをBNFを書き写すように簡潔に書ける
(自分はCやrubyでは書けなかった)
問題に応じて言語内言語を作れるので、コードの量を極めて少なくできる
短所
yaccやbisonより学ぶのにかなり時間がかかりそう
言語内言語を作れてしまうので、ぱっと見ただけではコードを理解できない
(数式を理解するには記号の意味を理解している必要があるのと同じ)
yaccやbisonを使った経験は無い
だが、Haskellの方が応用が利き問題の解決の仕方が美しいので学びたいとは思わなくなった
解決したい具体的な問題があり、自分が学んできた言語だとコードが大きく複雑になりそうで、新しい概念を学ぶ余裕と覚悟があるなら良いと思う
ただ便利そうなのを探してるとか興味があるってだけだと挫折するかも
Haskellを参考にしたより新しい言語を学ぶ方がスマートかもしれない
自分みたいにHaskellに懐疑的で徹底的に学んで悪口書いてやろうと思っているならマジお勧めwww
347デフォルトの名無しさん
2020/05/30(土) 19:36:21.64ID:/U1uledC348デフォルトの名無しさん
2020/06/01(月) 05:07:50.77ID:seoK/8uJ Ocamlを使わないといけなくなっていじり始めたけど、あれもこれも出来なくて不便だな
やたら冗長になるし…
やたら冗長になるし…
349デフォルトの名無しさん
2020/06/01(月) 07:39:57.03ID:L1Mt0gVE 書くのが不便になる代わりに、ぱっと見ただけで理解できるコードになる
という軍師の言葉をぱっと見ただけで信じる者だけがOCamlを使いなさい
という軍師の言葉をぱっと見ただけで信じる者だけがOCamlを使いなさい
350デフォルトの名無しさん
2020/06/01(月) 08:15:03.48ID:dkkr+KCk >>348
できないことの例を教えてください
できないことの例を教えてください
351デフォルトの名無しさん
2020/06/02(火) 01:46:24.39ID:UWOmEsh4352デフォルトの名無しさん
2020/06/05(金) 23:44:13.56ID:aqmhehrv memptyってなんでmunitやmidとかじゃないんだろうな?
emptyの心がよーわからん
文字列のように意味的に空なモノイドもあるが、
空じゃない例の方が圧倒的に多く一般的じゃないか?
ま、どうでもいいんだけどな
emptyの心がよーわからん
文字列のように意味的に空なモノイドもあるが、
空じゃない例の方が圧倒的に多く一般的じゃないか?
ま、どうでもいいんだけどな
353デフォルトの名無しさん
2020/06/06(土) 08:31:53.87 let nop = mempty in ...ってやってる(嘘)
354デフォルトの名無しさん
2020/06/10(水) 18:32:52.39ID:vPvQB3B1 top level の型の指定についての質問です。
haskellのルールでtop levelでないところでは曖昧な型で型推論してくれて通るけど、top levelでは一意に型が決まらないとダメとかなんとかそういうルールがあって、
それでハマって苦労した記憶があるんですが、今その事ふっと思い出したんですが、詳しい内容が思い出せません。
haskell ambiguous top level
とかでグクってもそれらしい話しが出てこないんですけど、なんか思い当たる方おられませんか?
haskellのルールでtop levelでないところでは曖昧な型で型推論してくれて通るけど、top levelでは一意に型が決まらないとダメとかなんとかそういうルールがあって、
それでハマって苦労した記憶があるんですが、今その事ふっと思い出したんですが、詳しい内容が思い出せません。
haskell ambiguous top level
とかでグクってもそれらしい話しが出てこないんですけど、なんか思い当たる方おられませんか?
355デフォルトの名無しさん
2020/06/11(木) 20:57:26.28ID:h7Wncfkb >>354
どういうことか、何か例を挙げることはできますか?
どういうことか、何か例を挙げることはできますか?
356デフォルトの名無しさん
2020/06/11(木) 23:57:59.62ID:oU50Re4d >>355
レスありがとうございます。
当時なんかのプログラム組んでてハマったんですが、どんな例だったかは思い出せません。
しかし制限の名前はわかりました。
monomorphic restriction (単相性制限) という奴でした。
ググってみると多相性を無制限に認めてしまうとメモ化の実装が難しくなるようで性能に影響してしまう事を避けるための制限のようです。
こまめに型宣言書くようにするか、性能を犠牲にしてもよいなら制限をなくすオプションとかもghcとかには用意されてるので実害は無いんですけど、昔ハマって原因突き止めるのにエライ苦労したのでなんだったかふっと気になってお聞きしました。
お騒がせしました。
レスありがとうございます。
当時なんかのプログラム組んでてハマったんですが、どんな例だったかは思い出せません。
しかし制限の名前はわかりました。
monomorphic restriction (単相性制限) という奴でした。
ググってみると多相性を無制限に認めてしまうとメモ化の実装が難しくなるようで性能に影響してしまう事を避けるための制限のようです。
こまめに型宣言書くようにするか、性能を犠牲にしてもよいなら制限をなくすオプションとかもghcとかには用意されてるので実害は無いんですけど、昔ハマって原因突き止めるのにエライ苦労したのでなんだったかふっと気になってお聞きしました。
お騒がせしました。
357デフォルトの名無しさん
2020/06/12(金) 03:07:06.96ID:YpUxhodA358デフォルトの名無しさん
2020/06/20(土) 10:17:27.94ID:6v+H5Lhm 今、最新のghcでdependent typesは使えますか?
359デフォルトの名無しさん
2020/06/23(火) 00:33:49.50ID:2ZCsz0wY 次の2つの関数の型の違いを説明していただけないでしょうか。
f :: C a => T a -> b -> b
g :: T a -> (C a => b) -> b
関数gのようなconstraintの使い方にはこのような効果や意味がある、
とはっきり説明できず、モヤモヤしています。
また、このようなconstraintの使い方には特別な用語があるのでしょうか。
webで検索して調べてはいますが、適切なキーワードが思いつかず、苦労しています。
f :: C a => T a -> b -> b
g :: T a -> (C a => b) -> b
関数gのようなconstraintの使い方にはこのような効果や意味がある、
とはっきり説明できず、モヤモヤしています。
また、このようなconstraintの使い方には特別な用語があるのでしょうか。
webで検索して調べてはいますが、適切なキーワードが思いつかず、苦労しています。
360デフォルトの名無しさん
2020/06/27(土) 16:04:56.51ID:FJC3hMrg Haskell用語だけでは説明できない気がする
C++用語で
a -> bのaとbはtemplateを実体化する引数
C a => bはtemplateの宣言であって実体化ではないのでgは意味がわからない
C++用語で
a -> bのaとbはtemplateを実体化する引数
C a => bはtemplateの宣言であって実体化ではないのでgは意味がわからない
361デフォルトの名無しさん
2020/06/28(日) 01:53:39.90 Steamで買えるHaskell製ゲームを教えて
362デフォルトの名無しさん
2020/06/28(日) 10:31:17.77ID:hu4PmWPn >>360
レスありがとうございます。
すいません、C++に精通していないため、templateの実体化や宣言の意味がよく分かりません。
件の関数型は次のブログにありました。
Introduction to Singletons (Part 1)
https://blog.jle.im/entry/introduction-to-singletons-1.html#going-backwards
ここの Going backwards の節です。
(昔、別のWebページでも見て、その時も不思議に思っていたのですが、どこのページだったか忘れてしまいました)
そこでは
withSingDSI :: SingDS s -> (SingDSI s => r) -> r
という型です。
確かに SingDSI s => のconstraintを外すと、この関数を呼び出すところで型エラーとなってコンパイルできません。
代わりに、型シグネチャの先頭に SingDSI s => を書いたとしても、です。
しかし、なぜ型が合わないのか理由が分かりません。
何かしらの意味があるはずなのですが・・・
レスありがとうございます。
すいません、C++に精通していないため、templateの実体化や宣言の意味がよく分かりません。
件の関数型は次のブログにありました。
Introduction to Singletons (Part 1)
https://blog.jle.im/entry/introduction-to-singletons-1.html#going-backwards
ここの Going backwards の節です。
(昔、別のWebページでも見て、その時も不思議に思っていたのですが、どこのページだったか忘れてしまいました)
そこでは
withSingDSI :: SingDS s -> (SingDSI s => r) -> r
という型です。
確かに SingDSI s => のconstraintを外すと、この関数を呼び出すところで型エラーとなってコンパイルできません。
代わりに、型シグネチャの先頭に SingDSI s => を書いたとしても、です。
しかし、なぜ型が合わないのか理由が分かりません。
何かしらの意味があるはずなのですが・・・
363デフォルトの名無しさん
2020/06/29(月) 23:47:59.12ID:MeiET0BU364デフォルトの名無しさん
2020/07/02(木) 23:40:38.85ID:Rg/xVuvf >>359
Haskell勉強中で答えられるほどの知識無いけど
constraintの意味から察するに、右の引数の型が正格評価されていないうちには受け入れないということでは
遅延的に型を選択して返すような関数は作れるけど、それを明示せずに正格評価の関数に渡せてしまうと追跡困難になる
引数の型を決定しておかないと渡せないようになってるんじゃないかな
つまり、前者は第一引数の型を指定してて、後者は第二引数の型を指定しているというだけだと思う
知らんけど
Haskell勉強中で答えられるほどの知識無いけど
constraintの意味から察するに、右の引数の型が正格評価されていないうちには受け入れないということでは
遅延的に型を選択して返すような関数は作れるけど、それを明示せずに正格評価の関数に渡せてしまうと追跡困難になる
引数の型を決定しておかないと渡せないようになってるんじゃないかな
つまり、前者は第一引数の型を指定してて、後者は第二引数の型を指定しているというだけだと思う
知らんけど
365デフォルトの名無しさん
2020/07/04(土) 23:44:16.95ID:LjgILXlp すごいブログを見てしまった後では気が引けるが、前に書いた随伴をhtmlにした
[デフォルトの名無しさん](https://pastebin.com/WTvqXjnT)
なんか動いているな、程度の確認しかしていないのでバギーだと思う
サイズが大きいけどほとんどがcss
パット見、jsは、require, jquery, mathjaxぐらい
実行環境はihaskell
[デフォルトの名無しさん](https://pastebin.com/WTvqXjnT)
なんか動いているな、程度の確認しかしていないのでバギーだと思う
サイズが大きいけどほとんどがcss
パット見、jsは、require, jquery, mathjaxぐらい
実行環境はihaskell
366デフォルトの名無しさん
2020/07/27(月) 22:40:30.17ID:XpS4ozgV 遅延評価のありがたみよくわからんかったけど
なんとなく分かった
使うか使わない情報、ひとまとめに定義したいんだけど
使わないのなら、情報取りに行くだけ無駄
でも、遅延評価なら、無駄と思える情報も定義できる
なぜなら、使って初めて情報を取りに行くのだから
なるほどね と思った
なんとなく分かった
使うか使わない情報、ひとまとめに定義したいんだけど
使わないのなら、情報取りに行くだけ無駄
でも、遅延評価なら、無駄と思える情報も定義できる
なぜなら、使って初めて情報を取りに行くのだから
なるほどね と思った
367デフォルトの名無しさん
2020/07/27(月) 22:51:22.29ID:u9oz0ryS 有名人だらけで楽しみですな。
https://haskell.love/
https://haskell.love/
368デフォルトの名無しさん
2020/08/13(木) 17:57:45.06ID:AeuuY+wz 圏論入門 Haskellで計算する具体例から
雪田修一 (単行本)
という本が近々出るので、Haskellの予習のためにHaskellの本を買いました。
プログラミング環境は何をインストールするのがおすすめでしょうか?
OSはWindows 10を使っています。
雪田修一 (単行本)
という本が近々出るので、Haskellの予習のためにHaskellの本を買いました。
プログラミング環境は何をインストールするのがおすすめでしょうか?
OSはWindows 10を使っています。
369デフォルトの名無しさん
2020/08/13(木) 18:55:01.02ID:AeuuY+wz Haskell Platformというのがいいみたいですね。
でもダウンロードしようとしたら、まず、Chocolateyとかいうのをインストールしなくちゃいけないんですね。
大丈夫ですか?これ?
でもダウンロードしようとしたら、まず、Chocolateyとかいうのをインストールしなくちゃいけないんですね。
大丈夫ですか?これ?
370デフォルトの名無しさん
2020/08/13(木) 21:17:46.02 Windows Subsystem for Linux 2 (WSL for short)を有効化してWSL用ディストリビューション(Ubuntu 20.04 LTSなど)をWindows ストアからインストールすることで、Windows内で仮想的にリナックスを使ってそこでHaskellを始めるのが良いです
371デフォルトの名無しさん
2020/08/13(木) 21:24:06.64ID:AeuuY+wz Windowsと比較してリナックスの利点は何でしょうか?
大きなアドバンテージはありますか?
大きなアドバンテージはありますか?
372デフォルトの名無しさん
2020/08/14(金) 06:03:07.79ID:OycuixUd >>369
今のHaskell Platformのインストールってそういう感じになってるんだな
Chocolatey自体はWindowsでそこそこよく使われているパッケージマネージャなので一応信頼してよい
今のHaskell Platformのインストールってそういう感じになってるんだな
Chocolatey自体はWindowsでそこそこよく使われているパッケージマネージャなので一応信頼してよい
373デフォルトの名無しさん
2020/08/14(金) 08:46:51.97ID:XgOd4/dA >>370
Windowsにそのままインストールしちゃいました。
Windows PowerShellから起動する以外の使い方はないでしょうか?
GHCiというのもグラフィカルユーザーインターフェースのソフトはないのでしょうか?
Windowsにそのままインストールしちゃいました。
Windows PowerShellから起動する以外の使い方はないでしょうか?
GHCiというのもグラフィカルユーザーインターフェースのソフトはないのでしょうか?
374デフォルトの名無しさん
2020/08/14(金) 12:57:45.74ID:XgOd4/dA リストとタプルについてなんですが、Pythonでのリストとタプルとは違いがあるようです:
let a = [1,2,3]
drop 1 a
としてもa == [2,3]とはなりません。
let b = (1,2,3)
drop 1 b
とするとエラーになります。
Pythonの場合は、a = [1,2,3]に要素を追加できましたが、b = (1,2,3)にはタプルがイミュータブルであるため追加できませんでした。
ですが、b[1:]とすれば、(2,3)というタプルが得られたと思います。
どう考えればいいのでしょうか?
let a = [1,2,3]
drop 1 a
としてもa == [2,3]とはなりません。
let b = (1,2,3)
drop 1 b
とするとエラーになります。
Pythonの場合は、a = [1,2,3]に要素を追加できましたが、b = (1,2,3)にはタプルがイミュータブルであるため追加できませんでした。
ですが、b[1:]とすれば、(2,3)というタプルが得られたと思います。
どう考えればいいのでしょうか?
375デフォルトの名無しさん
2020/08/14(金) 17:17:33.31ID:58KQIAkg376デフォルトの名無しさん
2020/08/14(金) 17:46:17.87ID:XgOd4/dA377デフォルトの名無しさん
2020/08/14(金) 20:54:14.09 なぜエラーになるかといえば、タプルにdropはないからです
リストは『全て同じ型』の要素の片方向リストです。要素数は可変です。C++のforward_listをイメージしてください
タプルは『それぞれ好きな型の組み合わせ』であり、リストではありません。要素数は固定です
両者は本質的に内部実装が異なります。リストは要素と、次に辿る先の情報を組にしたデータ構造、一方でタプルはその数だけデータを納めるのみのデータ構造です
抽象的には、リストは2要素のタプルであり、一項目に要素、二項目は(再帰的に)リストを保有します。
こうすることで、二項目を見れば(リストなので)『要素と、二項目にまたリスト』が格納されています
そのリストの二項目を見れば・・・となって単方向リストが実装できている事が理解できます
タプル(,)は二項関数であるとみなせます。コンマの左側と右側に一つずつ何かを取って入れる関数です。
リストでは実際は『:』という二項関数が二項タプルと同じ役目を果たします。つまり
要素 : リスト
のように書き
(要素, リスト)
と抽象的に同じであると気づくことができます。
リストは『全て同じ型』の要素の片方向リストです。要素数は可変です。C++のforward_listをイメージしてください
タプルは『それぞれ好きな型の組み合わせ』であり、リストではありません。要素数は固定です
両者は本質的に内部実装が異なります。リストは要素と、次に辿る先の情報を組にしたデータ構造、一方でタプルはその数だけデータを納めるのみのデータ構造です
抽象的には、リストは2要素のタプルであり、一項目に要素、二項目は(再帰的に)リストを保有します。
こうすることで、二項目を見れば(リストなので)『要素と、二項目にまたリスト』が格納されています
そのリストの二項目を見れば・・・となって単方向リストが実装できている事が理解できます
タプル(,)は二項関数であるとみなせます。コンマの左側と右側に一つずつ何かを取って入れる関数です。
リストでは実際は『:』という二項関数が二項タプルと同じ役目を果たします。つまり
要素 : リスト
のように書き
(要素, リスト)
と抽象的に同じであると気づくことができます。
378デフォルトの名無しさん
2020/08/14(金) 23:21:17.25ID:OycuixUd >>374
コンパイルエラーの文章を読んでぐぐる癖をつけよう
覚えはじめの頃に出会うエラーは大抵は文法ミスか型エラーだろうから
ぐぐれば「何が悪いか」はだいたい解決する
「なぜ悪いか」はすごいHaskellあたりを読み進めていけば習得できるはず
コンパイルエラーの文章を読んでぐぐる癖をつけよう
覚えはじめの頃に出会うエラーは大抵は文法ミスか型エラーだろうから
ぐぐれば「何が悪いか」はだいたい解決する
「なぜ悪いか」はすごいHaskellあたりを読み進めていけば習得できるはず
379デフォルトの名無しさん
2020/08/15(土) 17:24:00.25ID:uxgG4TyL >>377-378
ありがとうございました。
ありがとうございました。
380デフォルトの名無しさん
2020/08/16(日) 18:14:55.92ID:tHIsB9jz Haskellの本を読んでいると静的型付けだとか出てきます。
単にHaskellの仕様を理解するだけでなくもっと深く、どういう考え方でHaskellというプログラミング言語が設計されたのかにも興味があります。
プログラミング言語論みたいな本でおすすめの本はないでしょうか?
単にHaskellの仕様を理解するだけでなくもっと深く、どういう考え方でHaskellというプログラミング言語が設計されたのかにも興味があります。
プログラミング言語論みたいな本でおすすめの本はないでしょうか?
381デフォルトの名無しさん
2020/08/16(日) 21:18:57.26ID:EuDMb00g Haskellはある日突然に誕生したわけではなく、
その前身のMirandaとKRCという関数型言語から
多くの特質を受け継いでいます
これら言語に関してはW*k*p*d*aで簡潔に解説されてるので、
まずそちらを一読したのちに参考文献に当たるべきでしょう
以下ではW*k*p*d*aで欠けている日本語の文献を紹介します
Miranda
[1] 第7章 Miranda, p139-163,
新しいプログラミング・パラダイム, 共立出版, 1989年
ttps://www.am*z*n.c*.j*/dp/4320024931
Mirandaに関する包括的な解説
[2] 関数プログラミング, 近代科学社, 1991年
ttps://www.am*z*n.c*.j*/dp/4764901811
Mirandaを用いた関数型プログラミングの入門書
モナドを含む圏論の応用/発展が誕生する以前の時代に書かれた貴重な教科書
KRC
[3] 4. 関数型言語 KRC, p36-47,
新世代プログラミング, 共立出版, 1986年
ttps://www.am*z*n.c*.j*/dp/4320022599
[4] 6.2 KRC (Kent Recursive Caluculator), p132-142,
プログラミング言語の新潮流, 共立出版, 1988年
ttps://www.am*z*n.c*.j*/dp/4320023773
[3], [4] ともKRCに関する包括的な解説
KRCはすでにインデントベースの構文/純粋関数型/ パターンマッチ/リスト内包表記
といった特質を備えた動的型付け関数型言語でした
その前身のMirandaとKRCという関数型言語から
多くの特質を受け継いでいます
これら言語に関してはW*k*p*d*aで簡潔に解説されてるので、
まずそちらを一読したのちに参考文献に当たるべきでしょう
以下ではW*k*p*d*aで欠けている日本語の文献を紹介します
Miranda
[1] 第7章 Miranda, p139-163,
新しいプログラミング・パラダイム, 共立出版, 1989年
ttps://www.am*z*n.c*.j*/dp/4320024931
Mirandaに関する包括的な解説
[2] 関数プログラミング, 近代科学社, 1991年
ttps://www.am*z*n.c*.j*/dp/4764901811
Mirandaを用いた関数型プログラミングの入門書
モナドを含む圏論の応用/発展が誕生する以前の時代に書かれた貴重な教科書
KRC
[3] 4. 関数型言語 KRC, p36-47,
新世代プログラミング, 共立出版, 1986年
ttps://www.am*z*n.c*.j*/dp/4320022599
[4] 6.2 KRC (Kent Recursive Caluculator), p132-142,
プログラミング言語の新潮流, 共立出版, 1988年
ttps://www.am*z*n.c*.j*/dp/4320023773
[3], [4] ともKRCに関する包括的な解説
KRCはすでにインデントベースの構文/純粋関数型/ パターンマッチ/リスト内包表記
といった特質を備えた動的型付け関数型言語でした
382デフォルトの名無しさん
2020/08/16(日) 21:54:00.05ID:jqjR96Dg383デフォルトの名無しさん
2020/08/16(日) 22:04:09.80ID:mrCar2cd Haskellは魔窟の巣窟や 近寄るものは内臓から食い散らかされるデー
初心者はPythonが最適やろ〜
初心者はPythonが最適やろ〜
384デフォルトの名無しさん
2020/08/17(月) 17:36:03.87ID:CFLjXFs2385デフォルトの名無しさん
2020/08/17(月) 18:54:59.27ID:CFLjXFs2 クイックソートを行う関数を作ったのですが、エラーが出ます。どこが間違っていますか?
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = (quicksort [t | t <- xs, t <= x]) ++ [x] ++ (quicksort [t | t <- xs, x < t])
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = (quicksort [t | t <- xs, t <= x]) ++ [x] ++ (quicksort [t | t <- xs, x < t])
386デフォルトの名無しさん
2020/08/17(月) 19:01:32.08ID:QJrG17W6387デフォルトの名無しさん
2020/08/17(月) 19:03:19.26ID:CFLjXFs2 >>386
ありがとうございます。
エラーメッセージは以下です。
Prelude> :r
[1 of 1] Compiling Main ( baby.hs, interpreted )
baby.hs:153:1: error:
parse error (possibly incorrect indentation or mismatched brackets)
|
153 | quicksort :: (Ord a) => [a] -> [a]
| ^
Failed, no modules loaded.
ありがとうございます。
エラーメッセージは以下です。
Prelude> :r
[1 of 1] Compiling Main ( baby.hs, interpreted )
baby.hs:153:1: error:
parse error (possibly incorrect indentation or mismatched brackets)
|
153 | quicksort :: (Ord a) => [a] -> [a]
| ^
Failed, no modules loaded.
388デフォルトの名無しさん
2020/08/17(月) 19:05:47.77ID:CFLjXFs2 インデントも間違っていないと思いますし、カッコも問題ないと思うのですが。
389デフォルトの名無しさん
2020/08/17(月) 20:38:28.08ID:0Q701Csj390デフォルトの名無しさん
2020/08/18(火) 02:46:50.61ID:rj5JRKyz 153行より前の部分がおかしいんでしょ
391デフォルトの名無しさん
2020/08/18(火) 10:50:34.85ID:QANbTDtx392デフォルトの名無しさん
2020/08/19(水) 15:58:22.36ID:FHOhxH/M (1)と(2)で同じ関数だそうです。
add :: Int -> Int -> Int
は
add :: Int -> (Int -> Int)
と等価だそうです。
だとするならば、
(1)のほうが理屈の分かる書き方のように感じます。
(2)はadd' :: Int -> Int -> Intであると宣言しておきながら、その中身の表現を見ると、2つのInt型の引数を受け取ってその和を返す関数にしか見えません。
それにもかかわらず、add' 1は1引数の関数で引数に1を足す関数を表しています。非常に違和感を覚えるのですが、(2)は一体どういうことなのでしょうか?
わかりにくいです。
(1)
add :: Int -> Int -> Int
add n = \x -> x + n
(2)
add' :: Int -> Int -> Int
add' n m = n + m
add :: Int -> Int -> Int
は
add :: Int -> (Int -> Int)
と等価だそうです。
だとするならば、
(1)のほうが理屈の分かる書き方のように感じます。
(2)はadd' :: Int -> Int -> Intであると宣言しておきながら、その中身の表現を見ると、2つのInt型の引数を受け取ってその和を返す関数にしか見えません。
それにもかかわらず、add' 1は1引数の関数で引数に1を足す関数を表しています。非常に違和感を覚えるのですが、(2)は一体どういうことなのでしょうか?
わかりにくいです。
(1)
add :: Int -> Int -> Int
add n = \x -> x + n
(2)
add' :: Int -> Int -> Int
add' n m = n + m
393デフォルトの名無しさん
2020/08/19(水) 15:59:38.45ID:FHOhxH/M 単なる表現方法と割り切ればいいのでしょうか?
394デフォルトの名無しさん
2020/08/19(水) 16:07:34.77ID:FHOhxH/M nに対して、「mにn+mを対応させる関数」を対応させる関数の表記法として、
add' n m = n + m
を採用するというのが非常に不自然に思います。
add' n m = n + m
を採用するというのが非常に不自然に思います。
395デフォルトの名無しさん
2020/08/19(水) 16:24:31.96ID:amUamLwq 入門書のカリー化の箇所を読めばいいんじゃね
haskell内での関数は一変数関数として扱えて、
add' n m = (add' n) m
というだけ
haskell内での関数は一変数関数として扱えて、
add' n m = (add' n) m
というだけ
396デフォルトの名無しさん
2020/08/19(水) 16:31:52.13ID:FHOhxH/M397デフォルトの名無しさん
2020/08/19(水) 20:35:34.21ID:1ghAy1sC (今は結合性と優先順位は無視していいので)
n + m
は
(+) n m
と同じ意味になる。
つまり(2)は
add = (+)
に変数を明示して右辺の演算子を中置記法に戻しただけ
むしろ変数増やしたのが見にくい原因
n + m
は
(+) n m
と同じ意味になる。
つまり(2)は
add = (+)
に変数を明示して右辺の演算子を中置記法に戻しただけ
むしろ変数増やしたのが見にくい原因
398デフォルトの名無しさん
2020/08/20(木) 07:58:20.18ID:mQjEXV61 >>392
(1) の展開は中途半端で、ちゃんと書くならこう
(0)
add :: Int -> Int -> Int
add = \n -> \m -> n + m
これを(1)や(2) のように書いてもよいというのはHaskellの決め事
慣れないうちは常にこう書いていてもよいが
書くのも読むのも段々面倒になってくると思う
慣れればあまり意識せずに読み替えられるので
ついでに言うと
真の2変数関数が必要ならタプルを用いてこう書く
add'' :: (Int, Int) -> Int
add'' (n, m) = n + m
これらは確かに厳密には区別しなくてはいけないが、
ゆるく同一視しておくほうが便利なことも多いので
Haskellでは(2)のような書き方が許されている、と自分は理解している
(1) の展開は中途半端で、ちゃんと書くならこう
(0)
add :: Int -> Int -> Int
add = \n -> \m -> n + m
これを(1)や(2) のように書いてもよいというのはHaskellの決め事
慣れないうちは常にこう書いていてもよいが
書くのも読むのも段々面倒になってくると思う
慣れればあまり意識せずに読み替えられるので
ついでに言うと
真の2変数関数が必要ならタプルを用いてこう書く
add'' :: (Int, Int) -> Int
add'' (n, m) = n + m
これらは確かに厳密には区別しなくてはいけないが、
ゆるく同一視しておくほうが便利なことも多いので
Haskellでは(2)のような書き方が許されている、と自分は理解している
399デフォルトの名無しさん
2020/08/20(木) 08:57:36.69ID:LuBKaaMH400デフォルトの名無しさん
2020/08/20(木) 11:51:35.78ID:LuBKaaMH 圏論入門 Haskellで計算する具体例から
雪田修一 (単行本)
図書館に購入リクエスト済みです。楽しみです。
雪田修一 (単行本)
図書館に購入リクエスト済みです。楽しみです。
401デフォルトの名無しさん
2020/08/20(木) 14:53:48.13ID:uVfTx7sc >>1 simulationライブラリで純粋な関数式プログラミングをする ttp://x0000.net
学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
VM + ASM を書いた (C#, DX) * x86 ではない!
simulationライブラリで純粋な関数式プログラミングをする
UIライブラリ (C#, 2D) を作ったよ
連続と離散を統一した!
4Dエンジン
matrixのライブラリ
ある強力なFor関数
SQLライブラリ
VM + ASM のダウンロード
ttp://up.x0000.net/files/TSimulang.zip
学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
VM + ASM を書いた (C#, DX) * x86 ではない!
simulationライブラリで純粋な関数式プログラミングをする
UIライブラリ (C#, 2D) を作ったよ
連続と離散を統一した!
4Dエンジン
matrixのライブラリ
ある強力なFor関数
SQLライブラリ
VM + ASM のダウンロード
ttp://up.x0000.net/files/TSimulang.zip
402デフォルトの名無しさん
2020/08/21(金) 10:45:55.90ID:VIa1N6p8 関数の合成をする関数(.)を以下のように誤って書きました。
(x -> f (g x))はラムダ関数なので(\x -> f (g x))と書かないといけないと思います。
ですが、以下のコードでちゃんと動作しました。なぜでしょうか?
(.) :: (b -> c) -> (a -> b) -> a -> c
. = \g -> f -> (x -> f (g x))
(x -> f (g x))はラムダ関数なので(\x -> f (g x))と書かないといけないと思います。
ですが、以下のコードでちゃんと動作しました。なぜでしょうか?
(.) :: (b -> c) -> (a -> b) -> a -> c
. = \g -> f -> (x -> f (g x))
403デフォルトの名無しさん
2020/08/21(金) 11:35:07.30ID:VIa1N6p8 あともう一つ質問があります。
「すごいHaskellたのしく学ぼう!」に「関数合成は右結合なので、一度にたくさんの関数を合成できます。f (g (z x))は(f . g. z) xと等価です。」
と書いてありますが、左結合だったとしても、同様に一度にたくさんの関数を合成できるはずです。
左結合だったとしてもf (g (z x))は(f . g. z) xと等価であることに変わりはないはずです。
これは一体何が言いたいのでしょうか?
「すごいHaskellたのしく学ぼう!」に「関数合成は右結合なので、一度にたくさんの関数を合成できます。f (g (z x))は(f . g. z) xと等価です。」
と書いてありますが、左結合だったとしても、同様に一度にたくさんの関数を合成できるはずです。
左結合だったとしてもf (g (z x))は(f . g. z) xと等価であることに変わりはないはずです。
これは一体何が言いたいのでしょうか?
404デフォルトの名無しさん
2020/08/21(金) 18:51:58.39ID:3Xa4QDEo >>403
左結合だと等価にならないよ
左結合だと等価にならないよ
405デフォルトの名無しさん
2020/08/21(金) 18:53:55.87ID:VIa1N6p8 (f . g) . z = f . (g . z)だから等価だと思ったんですけど、間違っていますか?
406デフォルトの名無しさん
2020/08/21(金) 20:51:03.06ID:3LvfPoDL 通常の関数適用は左結合だから
f g z x は ((f g) z) x と同じ意味になって
コンパイルエラーになっちゃうけど
関数合成演算子を使うと括弧が減るよ、ということが言いたいはず
関数合成自体は結合的だからそこの向きは確かに関係ないね
f g z x は ((f g) z) x と同じ意味になって
コンパイルエラーになっちゃうけど
関数合成演算子を使うと括弧が減るよ、ということが言いたいはず
関数合成自体は結合的だからそこの向きは確かに関係ないね
407デフォルトの名無しさん
2020/08/21(金) 22:34:08.88ID:nqLClnr+408デフォルトの名無しさん
2020/08/21(金) 23:19:07.20ID:nqLClnr+ >>405
それってそうなの?
俺は、数学の本好きで読んでるんだけど、そこまで基本的なことは突き詰めてないw
写像の合成が結合則を満たす ものもたくさんありそうだけど、
写像の合成は必ず結合則を満たすものなの?そこから疑問に思った方がいいんじゃない?
数学の本読んでると、右XXと左XXと区別するものが多いんで、普通に満たさないと思ってたw
いや、俺が間違ってるかもしれんから、そこから調べてくれると俺もうれしい
ちなみに、大学数学レベルなのが 1+1=2 の証明。俺は調べたくないw
それってそうなの?
俺は、数学の本好きで読んでるんだけど、そこまで基本的なことは突き詰めてないw
写像の合成が結合則を満たす ものもたくさんありそうだけど、
写像の合成は必ず結合則を満たすものなの?そこから疑問に思った方がいいんじゃない?
数学の本読んでると、右XXと左XXと区別するものが多いんで、普通に満たさないと思ってたw
いや、俺が間違ってるかもしれんから、そこから調べてくれると俺もうれしい
ちなみに、大学数学レベルなのが 1+1=2 の証明。俺は調べたくないw
409デフォルトの名無しさん
2020/08/22(土) 00:32:18.31ID:75MjfSAz >>408
位相空間論の入門書には大抵書いてあるよ
あと「Haskellによる関数プログラミングの思考法」にも(証明は無いが)言及があった
((f . g) . h) x
= (f . g) (h x)
= f (g (h x))
= f ((g . h) x)
= (f . (g . h)) x
この等号は計算結果が等しいという意味で
途中の時間・空間計算量の違いは気にしていないので念の為
位相空間論の入門書には大抵書いてあるよ
あと「Haskellによる関数プログラミングの思考法」にも(証明は無いが)言及があった
((f . g) . h) x
= (f . g) (h x)
= f (g (h x))
= f ((g . h) x)
= (f . (g . h)) x
この等号は計算結果が等しいという意味で
途中の時間・空間計算量の違いは気にしていないので念の為
410デフォルトの名無しさん
2020/08/22(土) 00:48:03.06ID:66roH7xF >>408
しらんけど、位相空間って連続写像仮定してないか?
プログラミング言語でいう写像とは違う
位相空間論で一般的に言われているのならその定理を示した方がいいんじゃない?
個人的には位相空間論の書籍に限定しているのが気になる。どちらかと言うと代数学の方が一般的と思うが。
>あと「Haskellによる関数プログラミングの思考法」にも(証明は無いが)言及があった
こっちはたぶん書籍持ってるかな?ページ数教えてくれる?
四則演算というか群論でいう、逆元を仮定しているとかそんな感じやない?しらんけど
数学ではよくあるけど、仮定が大事 それを無視するから、結論を間違えるのはよくある
貴方が間違えたかどうかは知らんど
写像の合成で結合則が必ず成り立つのなら、そのような記述はどっかの書籍に必ずある
自分は見たこと無い。あるとすれば、なんらかの仮定で限定されている。
しらんけど、位相空間って連続写像仮定してないか?
プログラミング言語でいう写像とは違う
位相空間論で一般的に言われているのならその定理を示した方がいいんじゃない?
個人的には位相空間論の書籍に限定しているのが気になる。どちらかと言うと代数学の方が一般的と思うが。
>あと「Haskellによる関数プログラミングの思考法」にも(証明は無いが)言及があった
こっちはたぶん書籍持ってるかな?ページ数教えてくれる?
四則演算というか群論でいう、逆元を仮定しているとかそんな感じやない?しらんけど
数学ではよくあるけど、仮定が大事 それを無視するから、結論を間違えるのはよくある
貴方が間違えたかどうかは知らんど
写像の合成で結合則が必ず成り立つのなら、そのような記述はどっかの書籍に必ずある
自分は見たこと無い。あるとすれば、なんらかの仮定で限定されている。
411デフォルトの名無しさん
2020/08/22(土) 01:01:19.51ID:fPcZe606 知らん過ぎ
412デフォルトの名無しさん
2020/08/22(土) 01:40:43.87ID:75MjfSAz >>410
> 個人的には位相空間論の書籍に限定しているのが気になる。どちらかと言うと代数学の方が一般的と思うが。
位相空間論の〜っていうのは言い方が悪かったかな、「集合と位相」みたいなタイプのやつ
大抵最初の方で一般の集合論をやるのでそういうつもりで言った
仮定が大事というのはその通りで
もちろん連続性も全単射も仮定しない一般の写像に対する定理
集合A, B, C, D と写像 f: C->D, g: B->C, h: A->B に対して
(f . g) . h = f . (g . h) が成り立つ
> >あと「Haskellによる関数プログラミングの思考法」にも(証明は無いが)言及があった
> こっちはたぶん書籍持ってるかな?ページ数教えてくれる?
P.30 第1章 練習問題Eの解答
こっちはあまりにも簡素に書いてあるので見ても何の参考にもならないかもだが…
ただしHaskellには全域でない関数があるから(headとかtailみたいな例外を返し得るやつね)
そういうのが絡むと結合性が怪しいケースはもしかしたらあるかもしれない
> 個人的には位相空間論の書籍に限定しているのが気になる。どちらかと言うと代数学の方が一般的と思うが。
位相空間論の〜っていうのは言い方が悪かったかな、「集合と位相」みたいなタイプのやつ
大抵最初の方で一般の集合論をやるのでそういうつもりで言った
仮定が大事というのはその通りで
もちろん連続性も全単射も仮定しない一般の写像に対する定理
集合A, B, C, D と写像 f: C->D, g: B->C, h: A->B に対して
(f . g) . h = f . (g . h) が成り立つ
> >あと「Haskellによる関数プログラミングの思考法」にも(証明は無いが)言及があった
> こっちはたぶん書籍持ってるかな?ページ数教えてくれる?
P.30 第1章 練習問題Eの解答
こっちはあまりにも簡素に書いてあるので見ても何の参考にもならないかもだが…
ただしHaskellには全域でない関数があるから(headとかtailみたいな例外を返し得るやつね)
そういうのが絡むと結合性が怪しいケースはもしかしたらあるかもしれない
413デフォルトの名無しさん
2020/08/22(土) 12:23:17.90 ここ三年以内に発売されたハスケルの本は?
414デフォルトの名無しさん
2020/08/22(土) 13:18:34.82ID:g0O87mtN 空気読まずに有限集合でやってみる。
``` code
#{-# LANGUAGE ExistentialPython #-}
import math;
import random;
import string;
def none ():
dot = lambda bc, ab: {a : bc [b] for a, b in ab.items ()};
make_map = lambda a, b: dict (zip (a, random.choices (b, k = len (a))));
A = tuple (range (5));
B = random.sample (string.ascii_lowercase, 10);
C = random.sample (string.ascii_uppercase, 8);
D = (math.nan, math.inf, None, (), 'hello', 'world');
ab = make_map (A, B);
bc = make_map (B, C);
cd = make_map (C, D);
assert dot (cd, dot (bc, ab)) == dot (dot (cd, bc), ab);
return ((A, B, C, D), (ab, bc, cd));
out = none ();
```
自分の知る限り、素朴な写像の描像が描けないガジェットに対して「写像」という
言葉は使わないので、写像が結合的かどうかという議論に意味があると思えない。
``` code
#{-# LANGUAGE ExistentialPython #-}
import math;
import random;
import string;
def none ():
dot = lambda bc, ab: {a : bc [b] for a, b in ab.items ()};
make_map = lambda a, b: dict (zip (a, random.choices (b, k = len (a))));
A = tuple (range (5));
B = random.sample (string.ascii_lowercase, 10);
C = random.sample (string.ascii_uppercase, 8);
D = (math.nan, math.inf, None, (), 'hello', 'world');
ab = make_map (A, B);
bc = make_map (B, C);
cd = make_map (C, D);
assert dot (cd, dot (bc, ab)) == dot (dot (cd, bc), ab);
return ((A, B, C, D), (ab, bc, cd));
out = none ();
```
自分の知る限り、素朴な写像の描像が描けないガジェットに対して「写像」という
言葉は使わないので、写像が結合的かどうかという議論に意味があると思えない。
415デフォルトの名無しさん
2020/08/22(土) 13:19:16.92ID:g0O87mtN ``` code
#{-# LANGUAGE FunctionalJupyter #-}
import IPython.display as display;
def none (node, edge):
f = lambda col, a: {key : (row, col) for row, key in enumerate (a)};
nodes = {};
for val in [f (j, a) for j, a in enumerate (node)]: nodes.update (val);
edges = [];
for xy in edge: edges += [(nodes [x], nodes [y]) for x, y in xy.items ()];
node_out = r"""<text class='clazz' x='{x}' y='{y}'>{z}</text>""";
edge_out = r"""<line class='clazz' x1='{x_0}' y1='{y_0}' x2='{x_1}' y2='{y_1}'/>""";
out = '';
w, h, dw = 100, 20, 20;
for key, val in nodes.items (): out += node_out.format (x = w * val [1], y = h * val [0], z = key);
for a, b in edges: out += edge_out.format (x_0 = w * a [1] + dw, y_0 = h * a [0], x_1 = w * b [1] - dw, y_1 = h * b [0]);
style = r"""<style> text.clazz { dominant-baseline: middle; text-anchor: middle; } line.clazz { stroke: black; fill: none; } </style> """.strip ();
svg = f"""<svg width='400' height='300' viewBox='{-20} {-20} {len (node) * w + 20} {max (map (len, node)) * h + 20}'>{out}</svg>""";
display.display (display.HTML (style + svg));
return None;
none (*out);
```
#{-# LANGUAGE FunctionalJupyter #-}
import IPython.display as display;
def none (node, edge):
f = lambda col, a: {key : (row, col) for row, key in enumerate (a)};
nodes = {};
for val in [f (j, a) for j, a in enumerate (node)]: nodes.update (val);
edges = [];
for xy in edge: edges += [(nodes [x], nodes [y]) for x, y in xy.items ()];
node_out = r"""<text class='clazz' x='{x}' y='{y}'>{z}</text>""";
edge_out = r"""<line class='clazz' x1='{x_0}' y1='{y_0}' x2='{x_1}' y2='{y_1}'/>""";
out = '';
w, h, dw = 100, 20, 20;
for key, val in nodes.items (): out += node_out.format (x = w * val [1], y = h * val [0], z = key);
for a, b in edges: out += edge_out.format (x_0 = w * a [1] + dw, y_0 = h * a [0], x_1 = w * b [1] - dw, y_1 = h * b [0]);
style = r"""<style> text.clazz { dominant-baseline: middle; text-anchor: middle; } line.clazz { stroke: black; fill: none; } </style> """.strip ();
svg = f"""<svg width='400' height='300' viewBox='{-20} {-20} {len (node) * w + 20} {max (map (len, node)) * h + 20}'>{out}</svg>""";
display.display (display.HTML (style + svg));
return None;
none (*out);
```
416デフォルトの名無しさん
2020/08/22(土) 13:31:18.86ID:DGMheHKA それで?
会話や食事の中の唾液飛沫の3次元シミュレーションが出来るんですか?
会話や食事の中の唾液飛沫の3次元シミュレーションが出来るんですか?
417デフォルトの名無しさん
2020/08/22(土) 13:35:02.20ID:j3K8XBr1 >>402
あれ、これ今日コンパイルしたらエラーが出た。
単にコンパイルしていなくて、ghciで用意されている(.)を使ってテストしていただけみたいです。
以下の合成関数のコードはおそらく正しいと思います。
comp :: (b -> c) -> (a -> b) -> a -> c
comp = \f -> \g -> (\x -> f (g x))
あれ、これ今日コンパイルしたらエラーが出た。
単にコンパイルしていなくて、ghciで用意されている(.)を使ってテストしていただけみたいです。
以下の合成関数のコードはおそらく正しいと思います。
comp :: (b -> c) -> (a -> b) -> a -> c
comp = \f -> \g -> (\x -> f (g x))
418デフォルトの名無しさん
2020/08/22(土) 13:36:18.12ID:j3K8XBr1 圏論入門 Haskellで計算する具体例から (日本語) 単行本 ? 2020/8/19
雪田 修一 (著)
この超人気の本を読んだ人いますか?
雪田 修一 (著)
この超人気の本を読んだ人いますか?
419デフォルトの名無しさん
2020/08/22(土) 13:41:29.64ID:j3K8XBr1420デフォルトの名無しさん
2020/08/22(土) 13:45:41.47ID:j3K8XBr1 すごいHaskell、やっと5章まで読み終わりました。
この辺りから難しくなりますか?
この辺りから難しくなりますか?
421デフォルトの名無しさん
2020/08/22(土) 21:29:49.29ID:YtG8IJDk 難易度竹。
422デフォルトの名無しさん
2020/08/22(土) 21:45:32.55ID:j3K8XBr1 すごいHaskellの6章を読んでいますが、いきなり難しくなりました。
find :: (a -> Bool) -> [a] -> Maybe a
のMaybe aというのは探している要素が見つからなかった場合に返されるNothingが属するような型を用意したかったからですか?
find :: (a -> Bool) -> [a] -> Maybe a
のMaybe aというのは探している要素が見つからなかった場合に返されるNothingが属するような型を用意したかったからですか?
423デフォルトの名無しさん
2020/08/22(土) 21:46:48.62ID:j3K8XBr1 もしそうだとして、質問なんですが、Nothingはあらゆる型に属すると約束すればいいだけの話ではないんですか?
424デフォルトの名無しさん
2020/08/23(日) 07:53:38.79ID:m55Vd3Cb 「null安全」でググれ
かつて、あらゆる型に属するnullを導入していた言語が、
nullのない型を別途導入する方向に動いている
かつて、あらゆる型に属するnullを導入していた言語が、
nullのない型を別途導入する方向に動いている
425デフォルトの名無しさん
2020/08/23(日) 10:09:34.95ID:ts+Zp8he ヌルポはどこにバグがあるかを教えてくれるが、
ボトポにはそれさえない。
``` code
bottom :: a
bottom = bottom
dangerous_find :: (a -> Bool) -> [a] -> a
dangerous_find _ [] = bottom
dangerous_find pred (a : as) = if pred a then a else dangerous_find pred as
```
ただ役に立たないというだけでなく、
危険なほど役に立たない関数も作りたければ作れる。
ボトポにはそれさえない。
``` code
bottom :: a
bottom = bottom
dangerous_find :: (a -> Bool) -> [a] -> a
dangerous_find _ [] = bottom
dangerous_find pred (a : as) = if pred a then a else dangerous_find pred as
```
ただ役に立たないというだけでなく、
危険なほど役に立たない関数も作りたければ作れる。
426デフォルトの名無しさん
2020/08/23(日) 11:59:38.54ID:PT3WAMjf >>403
これ、左結合が出来ないからじゃない
考え方としては左結合はありなんだろうけど、
実質無いということ
f.g.h x で左結合やろうとしても、
関数適用と合成の優先順位で関数適用の方が優先される
結果として右結合にしかならない。
これ、左結合が出来ないからじゃない
考え方としては左結合はありなんだろうけど、
実質無いということ
f.g.h x で左結合やろうとしても、
関数適用と合成の優先順位で関数適用の方が優先される
結果として右結合にしかならない。
427デフォルトの名無しさん
2020/08/23(日) 12:29:03.24ID:hbFjgy0U 学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
VM + ASM を書いた (C#, DX) * x86 ではない!
simulationライブラリで純粋な関数式プログラミングをする
UIライブラリ (C#, 2D) を作ったよ
連続と離散を統一した!
4Dエンジン
matrixのライブラリ
ある強力なFor関数
SQLライブラリ
VM + ASM のダウンロード
ttp://up.x0000.net/files/TSimulang.zip
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
VM + ASM を書いた (C#, DX) * x86 ではない!
simulationライブラリで純粋な関数式プログラミングをする
UIライブラリ (C#, 2D) を作ったよ
連続と離散を統一した!
4Dエンジン
matrixのライブラリ
ある強力なFor関数
SQLライブラリ
VM + ASM のダウンロード
ttp://up.x0000.net/files/TSimulang.zip
428デフォルトの名無しさん
2020/08/23(日) 13:32:54.91ID:41ZiKAKU >>426
「関数合成は、一度にたくさんの関数を合成できます。f (g (z x))は(f . g. z) xと等価です。」
だったら、違和感がないんですが、
「関数合成は右結合なので、一度にたくさんの関数を合成できます。f (g (z x))は(f . g. z) xと等価です。」
には違和感を感じます。
一度にたくさんの関数を合成できる理由が関数合成が右結合だからというのはやはりおかしいと思います。
「関数合成は、一度にたくさんの関数を合成できます。f (g (z x))は(f . g. z) xと等価です。」
だったら、違和感がないんですが、
「関数合成は右結合なので、一度にたくさんの関数を合成できます。f (g (z x))は(f . g. z) xと等価です。」
には違和感を感じます。
一度にたくさんの関数を合成できる理由が関数合成が右結合だからというのはやはりおかしいと思います。
429デフォルトの名無しさん
2020/08/23(日) 13:36:29.73ID:41ZiKAKU Function composition is right-associative, so we can compose many functions at a time.
The expression f (g (z x)) is equivalent to (f . g . z) x.
これが原文です。翻訳がおかしいわけではないようですね。
The expression f (g (z x)) is equivalent to (f . g . z) x.
これが原文です。翻訳がおかしいわけではないようですね。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 ★2 [Hitzeschleier★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★2 [ぐれ★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【卓球】早田ひな、「総額100万スられた」「ずっと憧れていたスペインとイタリア…」ヨーロッパ旅行で悲劇 スリ被害を告白 [muffin★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 産経新聞「高市早苗の答弁さぁ……思慮が足りてなくね?官僚と詰めずに思いつきで話しているでしょ」 [175344491]
- 【実況】博衣こよりのえちえち歌枠🧪
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 【雑談】暇人集会所part18
- 高市早苗「支持者の理解を得られないので台湾発言を撤回できない」 [931948549]
- 外務省局長、よくわからないまま帰国へ [834922174]
