関数型プログラミング言語Haskell Part34
関数型プログラミング言語 Haskell について語るスレです。
Haskell Language(公式サイト)
https://www.haskell.org/
日本Haskellユーザーグループ - Haskell-jp
https://haskell.jp/
前スレ
関数型プログラミング言語Haskell Part33
https://mevius.5ch.net/test/read.cgi/tech/1581326256/ >>6
また実名っぽいの出して荒らしてんのかあいつ Haskellの話じゃないんだからどこか他でやってくれ 72スレ目って。
自分では気が狂ってることがわからないんだろな。
国民を守らなければ!って使命感があふれ出して72スレ。 a :: Int -> Int
a 0 = 50^2
a n = round (sqrt (realToFrac n):: Float)
型変換なみだでてきた
ghciプロンプトだと
round (sqrt 50)
7
ちゃんと出るじゃねーか... >>14
ghci 上で :t round . sqrt として
a :: Int -> Int との違いを比べてみるとよいよ (あとリテラルの50はIntではない)
数(特に浮動小数点数)まわりの関数でなみだ出てくるのは多少同意 ken80297274
岡部さんのサブアカウント発見 どんな人生を生きたら実名でこんな攻撃的な調子でtwitter上で不特定多数に絡みに行こうと思えるんだ
実際実社会で会ったらどんな感じの人なんだろう 岡部健さんはアメリカのUCLA卒業と書いていたらしいので、情報技術の素養はあるんじゃないか?
https://twitter.com/ohagiya/status/226163166067949568
http://archive.ph/1oA1C
>>「まああれでUCLAとかよく嘘こけるよねー。 」
>とは、これも、僕が学歴詐称しているという野田憲太郎の妄想にはじまる
>「バッシングに用いる好物のネタ」であり、もちろんそのような学歴詐称の事実などないし、それも名誉毀損として刑事告訴の要件に入っている。
https://twitter.com/5chan_nel (5ch newer account) Twitterで
ohagiya UCLA
で検索すると岡部健さんの学歴にけちを付けてる人が出てくるね ハリウッド映画でよくある、酒場でのウィットに富んだ大人の会話の一種では?
0時を過ぎると、酒瓶を割って拳で語り合う・・・いまその状態では?
夜が明けると、互いを理解し絆が深まる。
そして生涯の友となるのでは? https://ken-okabe
.hatenablog
.com/entry/2021/12/20/134121
『結局は、あろうことか、当時のQiita運営がこういう匿名炎上目的のアカウントの思惑に乗っかる形で、僕の反論コメントを消してしまったので』
と書いてるので、当時nonstarterさんの記事のコメント欄に出没していたのは岡部健本人だったのかな。
ことあるごとに「岡部氏」って別人のように書いてたのにね 高度IT人材、富士通は最大年収3500万円へ
「富士通年収3500万!」日本のIT企業の年収も、高額化してきました
AI人材の獲得に超本気 NECが新人事制度を9人に適用、富士通は最大年収3500万円へ
【年収3500万円も】富士通、「ジョブ型」人事制度を導入 幹部社員から 高度IT人材
来年度から副業解禁 人材多様化へ―大同生命次期社長
副業・兼務の解禁から4年、ロート製薬流で進めるキャリア支援
ロート製薬が副業をいち早く導入した「超人間的」な理由
ロート製薬会長が「副業を受け入れない会社は発展しない」と断言する理由 シンプルなワードカウント書いたけど関数合成でワードカウントが組めません
" ab ccc dd "を[0,1,1,0,1,1,1,0,1,1,0]みたいなリストに変換して
ワードの数は3みたいな
以下普通に書いたワードカウント
spwc4 :: [Char] -> Int
spwc4 s = wc4 s 0 0
where
wc4 :: [Char] -> Int -> Int -> Int
wc4 [] l c = (c + (if l == 0 then 0 else 1))
wc4 (x:xs) l c
| x == ' ' || x == '\t' || x == '\n' || x == '\r' = if l == 0 then wc4 xs 0 c else wc4 xs 0 (c+1)
| otherwise = wc4 xs (l+1) c
文字列を
chkspand :: Char -> Int
chkspand c = if c == ' ' || c == '\t' || c == '\n' || c == '\r' then 0 else 1
に与えて[0,1,1,0,0,1]みたいなリストに変換
これを関数合成でカウントすると内部状態を保持する必要で困惑中
wordcount . map chkspand $ " asas df df"
みたいな書き方がしたい 自己解決したけどデータが多いとスタックが...
>countword . countchars . map chkspand $ " 1313 13 111 rfr fdf"
>5 リストみたいなただのデータコンストラクタだったら、いくら長くてもスタック関係ないのに
リストをfoldrしたような物が出てくるとスタックでみんな躓く スクラッチで書くなら(0:)で0を追加して(0:1:_)をカウントしていくんだろうな
chkspand :: Char -> Int
chkspand c = if c == ' ' || c == '\t' || c == '\n' || c == '\r' then 0 else 1
wordcount = let
iterator [ ] = 0
iterator ( 0: 1: xs ) = 1 + ( iterator xs )
iterator ( x : xs ) = iterator xs
in iterator . ( 0 : )
main = do
print $ map chkspand $ " asas df df"
print $ wordcount . map chkspand $ " asas df df" >>29
wc5 = let
iterator [] = 0
iterator (0:1:xs) = 1 + (iterator xs)
iterator (x:xs) = iterator xs
in iterator . ((0::Int) :)
wc5 . map chkspand $ "0 hushjuh hhuj 89 546456"
5
上手く行きました
イテレータのパターンマッチ目からウロコ >>30のこれ
iterator (0:1:xs) = 1 + (iterator xs)
内部で
1+1+1+1+...が積みあがって最後に計算されるの? >>31
それは処理系のimplement依存だから一概には言えないけど多分stack上に(1+)関数が乗っていって最後に確定した0が入ってから計算しそうな気がする >>30ちょと改変
wc6 = let
iter n [] = z
iter n (False:True:xs) = let n' = n + 1 in seq n' $ iter n' xs
iter n (x:xs) = iter n xs
in (iter 0) . (False :)
wcc = wc6 . map chkspand2
これのseq n'が効けば+1+1+1+1が積みあがらないはず ghciで確認
>>30はスタックオーバーフローで止まった
>>34は止まらないからctr-Cで止めた OOPでも、整数を他のオブジェクトとは全然違う形式にしないと
計算が遅過ぎてダサくなるよね
逆にオブジェクトの方を整数と同じようなGC非依存みたいな構造にする手もあるか まぁコレは趣味による
Haskellでは性能面より可読性を重視するからな
それも使う人次第だけど
>>34のようにすればメモリも時間も節約できるけど可読性は失われる
どこまで我慢するかだけどオレは計算時間もメモリも線形までなら我慢して可読性を重視する
>>34だと入力に比例して要求されるスタック量が増える
線形までならしょうがないと思う
どのみち入力が大きくなるにつれてシステムが大きくなるのは元々しょうがないんだしその時の比例定数の違いまでなら我慢する
今具体的にやりたいことがあってその線形オーダーの無駄すら許されない状況なら考えるけど >>37
今回のお題はワードカウント、ファイルサイズがギガになる場合を想定
スタックなりヒープなりを消費しない手法は?です
Cなどで実装した場合、ループでカウントして再帰なしスタックもヒープも消費なしとか(可読性は...)
他にマルチスレッドで分割カウントした時の手法とか(ディスクのIOで律速か) 今回の場合1ワード消費するたびにスタック一個消費するから必要なメモリリソースが倍以上になる可能性もあるから意味はあるかな
特にコレは>>34の方法だと必要なメモリリソースがデータ保持する分を除けばlogオーダーになるからな
しかも読み込んだデータは順次捨てていけるし(そこまでのカウント結果を保持しないといけないので有限オートマトンでは無理だけど有限オートマトン以上、チューリング完全以下、こういう計算クラスは名前ついてるのかな?)
個人的にはこういうときメモリ線形、時間線形までは許さないと大した事できないことが多いのでそれ以上のこだわりは持たないようにしてる
数学的研究対象とかにするなら別だけど >>39
今回なにを確認したのか
それは、Cで組むような単純繰り返しを同じ感覚でヒャッハーとhaskellの遅延評価で行うと
ヤバイと言う教訓とそれを回避する手法 Haskellを身に付けた人は他の言語も使えると予想しますが、いくつもの言語の中からHaskellを選んで
プログラムを書くのはどんな課題、問題を解決したいときなんでしょうか 課題が「ガベージをコレクトしたい」だけだったとしても
じゃあ静的型は不要だとかジェネリクスは不要だとはならない
だから課題と関係ない部分を作り込む Twitterの検索で
@ohagiya @kenokabe
と入れると楽しいよな 最新の怪文書も読んだけどさ、毛の壁は毎回毎回威勢だけは良いんだよなw
たとえば「ちくわは民事でもやる!」「ちくわはもう詰み」(9年前)
「ちくわはもう死に体」(7年前)とかさ。
死に体なのに、つい最近もブログで恨み節w
ネズミ一匹、始末できないなんてだらしがないな 質問です
array と List の性能の差がいまいちピンと来ません
何か「この例ではどう考えてもarray、ほらこんなに性能に差が出る」って例ご存知ないですか? 質問です
何かの文章で
square x = x*x
print $ square $ square 3
のようなプログラムをHaskell は
square $ square 3
→ square ( square 3 )
→ ( square 3 ) * ( square 3 )
→ ( 3 * 3 ) * ( 3 * 3 )
のようになる
コレを避けるためにseqを使えばよいとあったのですが試しに
import Debug.Trace
square x = x * x
const3 = trace "*" 3
main = do
print
$ square $ square $ square $ square $ square
$ square $ square $ square $ square $ square
$ square $ square $ square $ square $ square
$ const3
みたいなプログラムで試してみました
もし説明通りならconst3が2^15回呼ばれて*がいっぱい出てきそうですが、やってみると*は一個しか出てきません
コレは何故ですか?
ちなみにghcです
ghcがconst3の結果を自分で勝手に“メモ化”してよきにはからってくれているんでしょうか? メモ化は独自実装ではなく仕様
何かの文章は嘘
でも騙されたことがないので被害が存在しないし、加害者も存在しない >>48
仕様なんですか?
Language Reportかなんかに書いてありますか? 何かの文章は "ウォークスルー Haskell" というやつでした
http://walk.northcol.org/haskell/eval-strategies/
3 ではなく 1 + 2 でやってました >>51
square x = x * x
を
square x = seq x $ x * x
にして明治的に“xを評価してからx*xを計算せよ”に変えるともちろん*ひとつです
それは納得いきます
ウォークスルーHaskellにもそうなると書いてあるしHaskell Language Report 2010にもseqで正格評価になると書いてあります
なのでコレは納得いくんですがseqなしの場合の動作が文書と異なるように見えます
もちろん参照透過性があるので一度計算した結果をメモ化して再利用しても同じ答えにならないといけないので答え自体は同じになるわけですけど
コレはたまたまGHCの開発者が優秀でHaskellの標準動作としては保証されない事までやってくれてるだけなのか、標準動作としてメモ化しないといけないことになってるのかどっちだろうと
今のところ今自分が勉強してるプログラムにはseq入れて明治的に正格評価してもらってるんですけど標準でメモ化してくれるなら消せるしスッキリするし、あるいは明示しないと他の処理系だとしてくれないなら残しとかないといけないし 銀の弾丸のHaskellをIT企業が採用したら市場を席捲できるのでは???
実際そうなると思う? Windows10にVSCode入れて、Haskellを遊ぼうとしたけど上手く入らない。
コマンドラインで細かく入れて遊ぶしかないかな。 https://www.haskell.org/ghcup/
>GHCup is an installer for the general purpose language Haskell. 毛さんは昔から色々酷いが
>>56のコメ欄の流れだけでいうと単に@Zuishinが分が悪いわ
珍妙な独自用語は早めに芽を摘まないといけない そうじゃなくて、PHPやHaskellごときが偉そうにすんなって事だろ。
質問者が来たらお茶菓子くらい出せ。
底辺やマイナー言語はそうするべき。 >>60
そもそも質問者が来たと思ってないんだろう
強いて言うなら「命令者」が来たと思われてるね >>56
どいつも誰だか知らんしどーでも良いが
見た感じ、@Zuishinの記事は確かにしょぼい記事だが、@stken2050の反論にも無理があるな
@Zuishinに関しては、大きな主張をしている割に根拠がかなりしょぼいせいで、記事として価値が低くなっているように思える
対する@stken2050の反論だが、「排他的ではないので反対ではない!」云々は無理がありすぎ
「反対」という自然言語の単語が元々ガバガバなのは誰だって知ってるんだから、それに対して自分で勝手に厳密な定義を与えて、その定義に基づいて矛盾を指摘したって、そりゃ「日本語わかりますか」言われるわ
さらに@stken2050の反論ではwikipediaと異なる高階関数の定義を使っているが、それならwikipedia以上に信憑性の高いソース出して、英語版wikipediaに書かれている高階関数の定義に疑問を呈するのが筋
それをしてないせいで論理的にぶっ飛んで見える Haskellって日本人に受けそうで実際一時期話題になったけど
結局下火になっちゃったね
なんでだろう haskellでしばらく何かを学んだら、元いたところに帰っていくんじゃないかな 型とGCが下火になったから
型無しならPython
GC無しならRustに行く 両方ないならAPIと言語が無関係なクラウドみたいな感じになりそう Cじゃだめなん?
あと、型なしじゃなくて、動的型で良ければ、
Objective-Cがかなり自由度高かった気がする。 単純に難しいからだろ
元の言語仕様はシンプルなのに、ソフトウェア工学的なノウハウに基づいてOOPと同等以上の実装を実現しようとすると、とたんに大量のGHC拡張と難解な型が出てきてわけわからんくなる setterの存在自体がマナー違反ということにすればある意味単純なんだよ
マナー違反したせいで複雑すぎるのは自己責任、言語のせいにするなってね >>79
こいつに“H“はムリ(爆)
“三擦り半“で昇天するよw GHC方言とかの知識が豊富な奴ってどちらかといえば反抗的な性格だと思う
それなのに、オリジナルの仕様への忠誠心が高ければ高いほど有能みたいな誤解がある
その上更にいかにも忠誠心なさそうなキャラまで作られてるし 最近数値計算の勉強してるんですけど、よく最近高速フーリエ変換を用いた乗算の高速化なんて話が出てきます
サイズの大きい整数の掛け算とかを高速化する手法で桁数n同士の乗算のコストをn log(n)に抑えるのだとか
これGHCのInteger型の乗算には応用されてますかね?
やっぱりそこまで速さに拘りたいならご自分でのスタンス?
GHCのソースが読めるほどのスキルはないのでよくわからない
そもそもGHCのソースってどこに転がってます? >>82
ghc haskell ソース でググれば見つかる ソースを1行も読まなくても分かることがいくつかある
IntとIntegerの二刀流ができるなら三刀流もできること
第二第三の型を追加するだけのためにコンパイラをコンパイルするのは無意味過ぎること >>82
見つからないorz
>>83
ちょっと数値計算の練習したいんですよ
例えば円周率10万桁とか
さすがに10万桁とかだとghcはデフォルトでは対応してくれないのかなと
仮にできるにしても10万桁×10万桁の計算で桁数^2オーダーで計算したのではその一個の掛け算で何年もかかってしまうことになりかねません
ただのarrayやlistなら10万要素位は扱ってくれそうですけど
ただHaskellでその手の大量データを扱うのは色々難しい問題があるらしいと言う話は聞いてたので今までは「そういうのはHaskellは向かない、そういう時はC」とか使い分けてました
しかしやはりHaskellでできないのは面白くないのでHaskellでもそういうでかいデータを扱えるスキルを身につけたいなぁというのもあります
まぁまだFFTでの掛け算プログラム勉強し始めたばっかりなので先は長そうですけど
とりあえず[Double]のFFTと逆FFT作ったとこまではやったんです
でもそこまで作って「アレ?もしかしてこんなの自作しなくてもそもそもHaskellのIntegerが最初からFFTで掛け算してるとかあるかも?GHCの開発者メチャメチャ優秀っぽいし」と思った次第 >>87
おお、thx
なるほどGMPというのを使ってるんですね
--Stack excangeより
GMP appears to use Schonhage-Strassen, but not until you start dealing with numbers with 10s of thousands of decimal digits.
GMPではSchonhage-Strassenを使用しているようですが、小数点以下が何万桁もあるような数字を扱うようになるまでは、このようなことはないようです。
--wikiより
GMPは、どんなオペランドの大きさでも他の多倍長整数ライブラリよりも高速であることを目標としている。このために、以下の点を重視している。
基本算術型としてフルワードを使う。
オペランドの大きさによってそれぞれ異なるアルゴリズムを使う。非常に大きな数に有効なアルゴリズムは、小さい数では遅いことが多い。
----
要するに自分でわざわざSchonhage-Strassenのアルゴリズム実装しなくてもそもそもintegerで実装済みという事ですね
そうじゃないかと思ったw
そりゃそうでしょうねぇ、こんな優秀なソフトが数値計算理論の最新の成果取り入れてないわけがないw
10万桁とかIntegerで扱えるのかな?
実はData.FixedにあるFixed aで100桁くらいは余裕というのは確認済みなんです
週末にでも桁数増やして実験してみます
ありがとうございました Haskellの多倍長計算、昔は大変だったけど今はよくなった、みたいな記事が10年前くらいに書かれてた
http://tanakh.jp/posts/2012-03-08-pi.html >>89
おお、先人がいたww
いや〜Haskellって速さ求めるならあんまりいい選択肢ではなさそうですけどやっぱり挑戦してみたくなりますね
その人のページのリンク先がすごく参考になりました
ようやくChudnovskyの公式とかいうのがなんで最速なのかわかりました
収束速度そのものはどう考えてもAGMの方が早いのになんでChudnovskyの方が早いんだと
Binary Splittingという技使ってまとめて計算していく方法があるんですね
ちょっと感動しました
まぁともかくInteger型の計算で10億桁くらいまで実用的な?速度で計算できるもんなんですね
ボチボチやってみます Haskell昔は日本でも人気あったのにどうしてこうなった 人気ないって事?
そりゃそうでしょ?
お世辞にも使いやすいとは言えない >>92
使いにくいと感じるところを教えてください 文字列操作のパッケージを作っている。
1文字づつ評価して処理するのは出来るけど
ループで実現しようとすると、上手くいかない。
[Char]型とString型で混ぜて作ったせいか
ボトムアップ方式で作るのが間違えなのか。
まだまだ初心者の愚痴。 >>91
純粋関数型といいつつ実際にはそうではないし
結局はモナドも使わなきゃ実用的なものは作れない
よく例題に上がるようなシンプルな書き方すると遅いし
Lispでも同じようにあった問題で綺麗な書き方よりも早い書き方が重視される
そうこうしているうちにどんどん人は離れていったよ
理念が現実に負けたのだと思う・・ あとそうだ
なによりもデバッグがあまりに困難すぎるし
デバッグのために型制約とか何バカやってんだろな・・って思うことしばしば
作業環境が悪いのがまるで改善されないから嫌になる 型はコンパイル時にしか存在しない
モナドクラスもコンパイル時にしか使わない
実行時に使われているのはモナドのインスタンスのみ
そのインスタンスは任意の言語で再発明できる
どの言語でデバッグしても困難は同じ
結局は再発明をやらなきゃ実用的な知識が身につかない 今だにprintfデバッグに頼ってるなんてHaskellくらいのものかもね・・ Cのライブラリに丸投げする効率化を考えれば
デバッグの効率化にはこだわらない方が丸投げしやすい 個人が言語を自作できるレベルになってる説
団体は必須ではない ハマりました
次のコード通らん理由が分からん
import Data.Ratio
[[ a,b],[c,d]] *** [[ p,q],[r,s]] = [ [ a*p+b*r, a*q+b*s], [c*p+d*r],[c*q+d*s]]
i [[ a,b],[c,d]] = [[d,-b],[-c,a]]
a :: [[Rational ]]
b:: [[Rational ]]
a = [[1%1,99],[0,100]]
b = [[100,0],[-99,1]]
main = do
mapM_ print $ [ a, b , i a , i b]
print $ (( i b ) *** ( i a ) ) *** b
実行時エラーで
prog: prog.hs:4:1-79: Non-exhaustive patterns in function
になる
一項目のprintの出力
[[1 % 1,99 % 1],[0 % 1,100 % 1]]
[[100 % 1,0 % 1],[(-99) % 1,1 % 1]]
[[100 % 1,(-99) % 1],[0 % 1,1 % 1]]
[[1 % 1,0 % 1],[99 % 1,100 % 1]]
を見てもどう見てもパターンマッチしてるのに?
何故? >>106
リストの長さがマッチしてない
長さが2でないリストをどこで作ったのかはソースを読めば分かる
***は長さが3のリストを返す >>107
あ、ホントだ
コピペミスかなんかか
thx おまいらこのクソ暑い夏をどうにかするCOOLなコードをHaskellで簡潔に書けんのか? ttps://hackage.haskell.org/package/mtl-2.3/docs/src/Control.Monad.Writer.Class.html#tell
listen ~(w, a) = (w, (a, w))
この~はどういう文法なの? stack でwxHaskell インストールしようとしたんだが、
> stack install wxHaskell
とすると
Unknown package: wxhaskell
とでてインストールできない。
StackだとwxHaskellインストールできないの?んなわけないと思うんだが。
公式見てもstackの場合の方法が書いてない。 stackage に入っていないからじゃないかな?
最近アップデートされていないし
並行処理も問題ありそうだし…
stack と GUI で検索したらこんな記事があった
https://www.stackbuilders.com/blog/gui-application/ ボトルネックは事実上バグと変わらないから
結局パフォーマンスを考えると
Haskellはバグが混入しやすい言語と言える
しかも入出力は正しいから解決がクッソ厄介で実用性はない ghci --show-options | wc -l
Output: 1200 書き込んでいた専門家たちが書き込みをやめたので下火になっている感が出ているわけですね。 イヤ、でも実際した火なんじゃない?
やっぱりHaskellで“性能”と“可読性”の両立を図るのはかなり難しい
やっぱり言語の生い立ちというか、性格というか、性能面、特に速度面の性能面はどうしても優先順位が低い、しかし実務上はもちろんそこは最重要factorだからそこがでないとした火になるのもやむを得ないかと 仕組みはわからんが計画的だろ。
言い換えると、騒ぐ奴らがうざいから騒がなくなるまで下火なんだろう。 てか元々世界のメジャーな言語に躍り出ようというつもりなんかHaskellコミュニティにはないのかもね
Haskellコミュニティなんて学者の集合体でしょ?
実務になんか元々興味ないんじゃない? StackでGUIプログラミングしたいのですが、stackでインストールできるライブラリで
おすすめのものはありますか。 haskellで作ったチェスゲームありますか
コマとボードはきれいなグラフィックで
マウスでコマを動かすチェス Haskellに飛びつく層は
Rustには飛びつかんよね
Rustには面白みが無い とにもかくにももう少しHaskellは速度性能を出すための方法の標準化について詰めてほしい
Haskell2010の文章のメモ化の部分の詰めがダメすぎる
実情のGHCとかで提供されてるものと差がありすぎて意味がわからん
GHCでの研究成果をもっと標準仕様に取り入れてほしい
何をどうやったら確実にドレコレはメモ化されるかハッキリ文書化してほしい 整理する気がないからな
どんどんカオスになって行く いまだにGHCというとGuarded Horn Clausesの方のGHCを先に思い出す 1番実用的な関数型言語やその影響が強い言語って何になるの? 標準規格を一番忠実に実装した奴が優勝みたいな考え方は全然数学的ではない ルールがない状態からルールが守られている状態へ誘導するか
何もしてないのに持続するルールを拾い集めるかの違い ラムダや <- や case で束縛される変数の値は二回以上計算されない
seqは計算のタイミングを変える効果しかない
難しいのは = で定義される名前だが
= の右辺で頑張ってseqを使っても報われない でもhaskell 2010 reportには評価順を変える方法はseqしか規定されていない
GHQなどの実際の処理系でそれ以外のタイミングでメモ化されたりするのはあくまで処理系の独自仕様でしかない
ある処理系でメモ化されて早かったプログラムが別の処理系で同じ速度で処理してくれる保証などどこにもない >>138
もしかして、個人の感想のようなものを悪と思ってるのかね
そして客観的事実 (ようするに絶対正しい事実) と称するものが正義だと
個人の感想を排除するべきという思想はどこにも規定されてないでしょ メモ化に関しては俺も>>138と同じような感想持ってるな ある人の感想が別の人の感想と同じになる保証はどこにもない
保証がなくても特に問題ないと判明したならそれでいい 一番嫌なのはネットに転がってるすごいスッキリしたプログラムがあって「おお、すげぇ」と思っても結局それはGHCのメモ化の恩恵でしかなくHaskell本来のそれではないので別の処理系では通用しないものであったりする事
事実上GHCが標準なのでGHCで早ければ「早いプログラムが書けない事はない」のではあるけど、じゃあGHCはどんな時は気をきかせてメモ化してくれるのか、どんな時はその事を利用して早い、しかし短い、わかりやすいプログラムを書けるのかはHaskell 2010 reportではなくGHCの方の仕様書を読むか、実験してみるかしかない、しかし前者はそもそもGHCの仕様書そのものどこにあるかわからないんだけど見つけてもおそらくメモ化の理論は相当に難しい論文レベルの話、さりとて実験で詰めていくのはデバッグと同じレベルのかなり苦痛な作業で、しかも完成したものは大概速さのために可読性をかなり犠牲にしないといけないものになる、当然可搬性も落ちてる
GHCがやってくれてる事全てでなくてもいいけどネットによく転がってるフィボナッチ数列とか素数生成とかのGHCの良きに計らってくれる機能を利用したスッキリした、けど早いプログラムくらいまでは標準化して全ての処理系で動くようにしてほしいけどね まあ実際のところメモ化を考え出したら
Lispと同じように可読性を犠牲にした速度重視のコードしか生まれないので・・
メモ化は考えないのが筋だけどそうすると実用性は皆無であってつまり LispとHaskellの違いで重要なのは
モジュールの定義をインタラクティブにやらないこと
ghci起動時に全てのモジュールが定義され最後に
mainや他の式を評価・実行するところだけがインタラクティブ
そもそもmodule Main whereとかいうのは式ではない
式ではないから評価順序という考え方がそこでは通用しない GHCがデファクトだしこだわりがなければ他のコンパイラを使うこともないでしょ
とはいえ関数型言語って速度を重視するタスクには向かないでしょ
速さを求めるのが間違い Symbolicsが失敗した事例を思い出す
あれも理想を追求したはいいけど何をやってもひたすら遅く
他社はそれより早く安い機材を次々と繰り出していた
当然惨敗は必然だった 結局のところHaskellの言語策定をしてるコミュニティは学者さんのコミュニティで実用的な性能を向上させる事にそもそも興味ないから実務面での有用性を期待するのは無理やね >>142 の指摘って他の言語のGCにもそのまま当てはまると思う。 Haskellで開発している会社ってどこがあるの?
検索するとHERPやTuruCapitalしか出てこない… Haskell wikiに載ってるやつ見るに、部分的にHaskellを使うって感じかなぁ >>151
一時期富士通が募集してたことがあったような
もうないからやめたのだろうけど あと朝日ネットの募集要項はHaskellがありました
朝日ネットに応募してみようかなぁ。
HERPはリファレンスチェックが面倒…(上司とかと会話したくない) Haskellの求人、あまり見つからないんですが、言語として微妙な感じなんでしょうか…?
HaskellでできることはPython、Java、Go、Scalaでできる、みたいな…
あえてHaskellを使う意味がない、みたいな… オーバーヘッドを気にせず頑健性を取りたいとき
うーん、具体例が出てこない >>157
> Haskellの求人、あまり見つからないんですが、言語として微妙な感じなんでしょうか…?
> HaskellでできることはPython、Java、Go、Scalaでできる、みたいな…
> あえてHaskellを使う意味がない、みたいな…
かきか 消費者目線ではGHCはフリーソフトだからコストが高いとは言えない
コストという物差しが万能ではない具体例がいま出た どういう結果になるのか契約とか誓約しないのがオープンソース
お遊びにしかならないという保証もしてない 無生物であることは保証する
何も実験してないのに保証することを数学的と言えないこともない Unreal Verse
https://simon.peytonjones.org/assets/pdfs/haskell-exchange-22.pdf
サイモンさんが関わってるからHaskellの弟分なのかな?
unreal engineに採用なら関数型プログラミングでは
一番使われることになるんだろうか ちょっとやってみるかと思ったら
今はHIEじゃなくてHLS使えみたいなのがぼちぼち出てくるが
じゃあHLSをemacsからどう利用すりゃいいのってなると情報なし
どうなってんのよ
haskell-modeなんて2016で止まってるし >>166
10年越しのビジョン実現で胸熱
https://pc.watch.impress.co.jp/docs/column/kaigai/555239.html
>プレゼンテーションを見ると、Sweeney氏はゲームコードを走らせるプラットフォームが超並列化して行くことを予見し、Unrealの場合は80%のCPUユーセージを並列化が可能だと語っている。また、(ソフトウェア)トランザクショナルメモリや、プログラミングには関数型言語(例としてHaskellを挙げていたが、同時にHaskellに好ましくない点もあると説明している)がフィットすることなどを語っている。
それにしてもSPJを引き抜くなんてゲーム業界はすごい いや15年越し
https://game.watch.impress.co.jp/docs/20080911/epic.htm
>Sweeney氏は純粋関数型言語のもつ並列処理安全性に着目しており、将来的にゲームプログラミングはそういった処理系に移行していくべきだとした。Sweeney氏はそのひな形として言語“Haskel”を挙げているが、ゲーム開発のメインストリームたり得る言語はまだ登場しておらず、将来に期待しているという。 HaskellでWebシステムのバックエンドを開発したときのメモリ使用量は
GoやPythonと比較してどの程度でしょうか?多いですか?少ないですか? サーバとクライアントのサンプルプログラムを練習で書いたのだけど
toSend <- T.getLine
sendAll sock (E.encodeUtf8 toSend)
日本語文字列を出力するのにByteStringを経由しなきゃいけない
もしかして任意の型でやりとりがしたいとき
自分でByteStringにパック&アンパックしなきゃいけない?
多分、C言語のFFIがベースになってるからこんな風になってるんだよね? >>171
明示的に変換しなきゃいけないのは事実だがその原因はC言語じゃない
言語と無関係だからこそHaskell2010でもC言語でも同じデータ構造が使える
>>170
データだけ見ればメモリ使用量を同じにすることは可能 モノイド、関手は習得できたけど
自然変換で躓いてる 今haskellでguiを作るなら何がいい?
できれば低レベル層のライブラリは使いたくないけど
wxはもうめんてされてない
fugets?threepenny?webviewhs?どれもarchのパッケージにない
実用言語としてhaskellを使いたいのに使えないのばかりで悲しい ところでwxHaskellが流行らないのはなぜ?
wxが流行ってないからかな? 本当に必要なのはドリルの大量生産ではなくドリルでもなく穴だからかな 見放されるようになったのは、
モナドってなに?というミステリアスで興味深い問いがいつのまにか
白けた話になったからじゃないか。もうどうでもいいというか。 メンテナーが次々と逃げ出してるのが象徴的・・
わかりやすいコードを書くとすこぶるパフォーマンス悪いし
だからといって頑張ると一体これは何をしたいのだってなる
遅延評価がデフォルトなのも非常にまずいし
正格評価と切り分けて結局は書かなければならずまだまだ発展途上だと感じる
いっそのこと正格評価はなしとした方がいっそ清々しい PureScriptに移行しようぜ
正格評価で使いやすいし あんなもの現実には扱えないからな
適当な数値を上限にしとけばいいだけ その割にデメリットの方が大きすぎる
やはりいらないよ PureScriptと被ってるかな?
[GHC 9.6.1-alpha1 is now available - Announcements - Haskell Community](https://discourse.haskell.org/t/ghc-9-6-1-alpha1-is-now-available/5585) 無限の長さの [a] を仮に廃止して他の言語と同じような方式に変えたら IO a のような型になる
生物学とか好きそうな人達は [a] と IO a の差が致命的 (つまり一方は死ぬが他方は生き残る)
と決めつける傾向がある 言語は死なないとか復活させればいいだけとか思うならもう生物学関係ない
そう思わないなら関係ありそう クラウドは中に人がいるのか無人なのか調べられないので
人間と機械を混同したのではなく不確実にした 嘘を書くのをやめろって言われない努力はしてる
現に、嘘だと言われない それっぽいだけで少し読めば大したことすら書かれてないのがわかる 「わかる」と「意味不明」は矛盾しそう
どっちかが嘘ついるのでは >>199
お前読解力もないのか
もうこのスレ来るなよ 教科書の通りなのになんでエラーになるんだろう?
code:
fork :: (a->b, a->c) -> a -> (b, c)
fork (f, g) h = fork (f h, g h)
main :: IO ()
main = do
print $ fork (map fst, map snd) (zip [0 .. 4] "hallo")
Output:
Error occurred
ERROR line 2 - Type error in explicitly typed binding
*** Term : fork
*** Type : (a -> b -> c,a -> b -> d) -> a -> b -> (c,d)
*** Does not match : (a -> b -> c,a -> b -> d) -> a -> (b -> c,b -> d) >>205
fork (f, g) h = (f h, g h)
では? >>206
ありがとうございます。その通りでした。
code:
pair :: (a->b, a->c) -> a -> (b, c)
pair (f, g) x = (f x, g x)
fork :: (a->b, a->c) -> a -> (b, c)
fork (f, g) h = pair (f, g) h
main :: IO ()
main = do
print $ fork (map fst, map snd) (zip [0 .. 4] "hallo")
Output:
-- ([0,1,2,3,4],"hallo")
これで上手く動いたので報告しておこうと思ったら、同じことを2時間以上も前に... oTL Haskell使い(でLinux使い)の皆さんってxmonad使ってますか?
ウィンドウフォーカスを切り替えるときにfloatingウィンドウは無視するようにしたいです。
オリジナルのfocusUp'関数は
focusUp' :: Stack a -> a
focusUp' (Stack t (l:ls) rs) = Stack l ls (t:rs)
focusUp' (Stack t [] rs) = Stack x xs []
where (x :| xs) = NE.reverse (t :| rs)
と大変記述量の少ない作りになってるのですが、これに最小の変更を加えて目的を実現するとしたらどうするべきでしょうか? ChatGPTにいろんなサンプル書かせて勉強させてもらってるわ >>208ですがスレチですかね
Linux板のタイル型WMスレに移動させていただきます (全く動いてないスレなのでダメ元ですが……) すみません
凄いHを楽しく学ぶ本を復習していて
疑問に思って試してみたのですが
具体的な型が決まらない値(単独変数で)は
下記の(Maybeや配列)の他にどんなのがありますでしょうか。
v1 :: Maybe a
v1 = Nothing
v2 :: [a]
v2 = []
型拘束を使わない型変数を使って
ある単独変数の型を定義できない物かと思いました。
また関数でも具体的な型が決まらない値を返す
関数はありますでしょうか。
(Nothingや空リスト以外で) >>211
Bing チャットに聞いたらこんなのが返ってきた。参考になるかな。
型変数を含むデータ型の例としては、関数型、代数的データ型、型クラスなどがあります。
例: data Tree a = Leaf a | Node (Tree a) (Tree a)
この代数的データ型Treeは任意の型aを要素とする二分木を表します。
例: class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
この型クラスEqは任意の型aに対して等値性を定義するための仕組みです。 >>212
ありがとうございます。
凄いHを楽しく学ぶ本にも
Tree型があったので試してみました。
具体的な中身が「無い」事を現す値の場合
型引数で定義できるみたいです。
data Tree a = EmptyTree | Node a (Tree a) (Tree a)
deriving (Show)
v3 :: Tree a
v3 = EmptyTree マルチポストだが教えてくれ
【追記あり】ChatGPTじゃなくて人力でモナドが発明された経緯を適当に調べた(ソース付き)。
https://qiita.com/iHdkz/items/e7a59eef034ab6d0fdc2
この記事正しいの?こんな話聞いたこともないし。圏論でモジュール性なんて扱えるの? >>214
よく分からんけど「モナドが発明された経緯」ではないな
1971年の本ですでにモナドについて書かれてるようだし
en.wikipedia.org/wiki/Categories_for_the_Working_Mathematician >>214
英語で調べてもそんな話出てきたことはないな。 do 記法でのメモ化について質問です
例えば
do
let x <- someComplexExpression
print $ f x
print $ g x
のようなコードがあったとしてxの値はf xの評価の時点とg xの評価の時点で2回別々にされますか?
少なくともHaskell2010 Lang. Rep. (以下HLR2010)ではこのような場合メモ化されて2回展開されることはないという記述を見つけることはできませんでした
なので公式にはこのような記述だと2回展開されると思わなければいけないのだと思います
ではsomeComplexExpressionを先に展開してから、展開したものをxにbindするにはどうすれば良いのでしょうか?
HLR2010ではswqを使えば良いとあるのですがこの場合
x <- seq someComplexExpression someComplexExpression
とかでうまく行くんでしょうか?
またそれでうまくいってるのかどうか確かめる方法はありますか?
つまり実際何回 someComplexExpressionが展開されてる回数を確かめる方法はありますか?
よろしくお願い致します 質問にさせていただきます
違う標数での有限体での計算を必要とするコードを考えてます
ある変数に𝔽₃や𝔽₅の値を混在して代入することはないので𝔽₃の元を生成するconstructor F3や𝔽₅の元を生成すconstructor F5を定義して
x = F3 $ 1+2
y = F5 $ 2-5
のような記述ができればいいなと思ってます
そのためには
data FiniteFieldCh3 = F3 Int
instance Num F3 where...
のようにF3,F5両方にNumを定義しないといけません
面倒なのでFiniteFieldと言うクラスを作って以下のようにできないかやってみたところ
class FiniteField t where
modulus :: t -> Int
toInt :: t -> Int
fromInt :: Int -> t
instance ( FiniteField a ) => ( Num a ) where
x + y = fromInt
$ mod ( toInt x ) + ( toInt y ) ) ( char x ) 以下のようなerror が出てきます
prog.hs:22:10: error:
• The constraint ‘FiniteField a’
is no smaller than the instance head
(Use UndecidableInstances to permit this)
• In the instance declaration for ‘(Num a)’
|
22 | instance ( FiniteField a ) => ( Num a ) where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
コレはなんですか?
ちなみにFlexibleInstancesというのが必要かとの事なので冒頭に
{-# LANGUAGE FlexibleInstances #-}
を入れています
コンパイラはghc8.4.4です
よろしくお願い致します すいません、最後の行間違って修正前のやつコピペしました
class FiniteField t where
modulus :: t -> Int
toInt :: t -> Int
fromInt :: Int -> t
instance ( FiniteField a ) => ( Num a ) where
x + y = fromInt
$ mod ( toInt x ) + ( toInt y ) ) ( modulus x )
です
よろしくお願い致します 型クラスの単相性制限とか、関数従属性とか、とか。。。
的外れなこと言ってたらごめん。 なんか Bard とかにつっこんでも情報得られるかも ありがとうございます
現在まだ調べてる最中なんですけど
https://stackoverflow.com/questions/7198907/haskell-constraint-is-no-smaller-than-the-instance-head
によるとどうもclass制約の解決をloopさせないための制約くさいです
つまり「aがclasd Cのときclass Dにも入れる事ができる」、「aがclass Dのときclass Cにも入れる事ができる」の宣言
class ( C a ) => D a where ...
class ( D a ) => C a where ...
のような宣言があるとまずいようです
なので=>の左側の型は右側の型より“短い”事が要求されるそうです
例えばtoDみたいな型生成子を作っておいて
class ( C a ) => ( D ( toD a ) ) where ...
などとしないといけないらしいです
でその後newtypeを使うとどうやらこうやら書いてあるんですけどなんのことやら 値とmoduleどっちも含んだdata作ればいいのでは >>226
こういうやつですね
data FiniteField = FF { val :: Int, modulus :: Int } deriving ( Show, Eq)
instance Num FiniteField where
x + y = FF ( mod ( ( val x ) + ( val y ) ) ( modulus x ) )( modulus x )
x * y = FF ( mod ( ( val x ) * ( val y ) ) ( modulus x ) )( modulus x )
fromInteger x = FF x 1
でもコレだと例えば
x = FF 2 7
y = FF 4 7
x + y
のような場合実行時にプログラムは値に格納されてるmodulusを読みに行ってから割り算行うという手間がかかります
しかし私のやりたいプログラムではそもそも各変数のmodulusは確定していてそもそも読みに行くのはバカバカしい感じがします
実行時にxもyも𝔽₇の元と決まりきっててmod の第二引数はコンパイル時点で7と決まっているのにその7を読みに行く作業が無駄に思えるんです
しかもコレは型ではなく値なので型チェックの恩恵も受けることができません
プログラム中に出てくるmodilus事に全部F2型、F3型、F5型‥と全部作って全部のNum instance一個ずつ定義してとやればできるんでしょうけど、何が上手い逃げ道はないものかと みなさん情報ありがとうございます
色々紹介していただいたソースとか自分で探してみた情報とかでまずは一区切りつける事にしました
こんな感じになりました
https://ideone.com/3Lhc4z haskellは廃れてきてるな、悲しい
スペースリーク対応は難しすぎるしライブラリ類も最新のghcだと使えなかったりしてなんか
実用的な言語じゃないなって思う
xmonadなんかはほとんどBangPatternだよね
そういえば自動でstrictにする拡張が2個ぐらいあったけど追ってないどうなの 数学の集合は普通順番を付けて書くと思うのですが(添字でアクセスできたほうが便利)
なぜ多くの言語では集合に順番がないのでしょうか? 等価判定演算子では順番を問わないが、
記法としては順番によるインデックスアクセスもできる、が便利だと思うのですが
一番基礎的な集合の一つである自然数が順番を重視して扱うように大半の集合は順序を整頓して書かないと実用上不便ではないでしょうか? 順番がないやつと順番があるやつは
なぜ対等な関係ではなく前者が一般的で後者が特殊だと言われるのか?
逆に、複素数はなんで虚部があるやつが一般的で虚部がないやつが特殊なのか? 数学的概念として等価だったりどちらが特殊とか言えないのは納得しています
ただ、集合は順序を維持して記述するようにしたほうが明らかに認知的負荷が少なく、数学的記法でも多くの場合でそうなっていると思うのですが、
多くの言語で組み込み型の集合がそうなっていないのはどのような思想によるものでしょうか?という質問です データ型としての起源としては
素集合データ構造から始まっているようなので
素である(disjoint)ことがまず要求されて
他に集合という名前が使われていないことから
素で非順序的なデータ型のことを集合型と呼ぶことになった模様 組み込み型とユーザー定義型の区別をなくす思想はある
最も正しいことを実現する思想ではなくミスをした場合の罪が軽くなる 初心者は++を使うけどなれたら<>を使ってる人が多い気がする
SemiGroupであれさえすれば使える<>を使った方が汎用的にかけるからかな 俗説が廃れるのは「時代が変われば正しさが変わるから」ではありません
俗説が正解だった時代などない unixのtouchを実現したいのですが
{-# LANGUAGE OverloadedStrings #-}
import System.Posix.Files.ByteString
main = do
touchFile "hoge.txt"
touch.hs: hoge.txt: touchFile: does not exist (No such file or directory)
というエラーがでます
ないのは当たり前でtouchで作ろうとしてるのですがバグがあるのでしょうか? unixのtouchを実現したいのですが
{-# LANGUAGE OverloadedStrings #-}
import System.Posix.Files.ByteString
main = do
touchFile "hoge.txt"
touch.hs: hoge.txt: touchFile: does not exist (No such file or directory)
というエラーがでます
ないのは当たり前でtouchで作ろうとしてるのですがバグがあるのでしょうか? すみません、書き込むボタンの反応がなかったので連投になってしまいました touchの本来の意味を考えれば、まあできなくてもそういうもんだなと思ふ touchの本来の意味を考えれば、まあできなくてもそういうもんだなと思ふ ありゃ俺も連投しちまったすまん
なんか5ch重いっぽいね for i in * ; do touch anotherdir/$i ; done >>246(bash)でお茶を濁した
perlが明日消えてなくなるらしいのでHaskellをPerlの代わりに使おうと思う
正規表現とグロブ、ファイル入出力はできた
他に何かあるかな 数値のリストl=[1,10,3]みたいなのを
1 10 3と出力したい。末尾には空白はあってはならないとする
最初
putStrLn $ intersperse ' ' $ foldl' (\acc x -> acc ++ show x) [] l
こんなのを考えたのだが10も1 0と分解されてしまった
しかたなく泥臭いこんなコードを書いたのだがもっといい方法はないだろうか
mp [] = return ()
mp [x] = putStrLn $ show x
mp (x:xs) = do
putStr $ show x ++ " "
mp xs putStrLn $ intercalate " " $ map show l
これでいけました 泥臭いだけで罪があるかのように日常的に刷りこまれてるから
本当の有罪確定したやつは絶対許してもらえないよな
そりゃそうだよな {-# LANGUAGE BinaryLiterals #-}
この拡張をいれても
let t = read "0x111" :: Int -- 16進数にパースできる 273
let s = read "0b111" :: Int -- 2進数にはパースできない
微妙に不便だ readが定義されたモジュールは別のLANGUAGEってこと? groupBy (\a b -> snd a == snd b)
これを括弧を使わずにかけますか
groupBy ((==)<$>snd<*>snd)だと(a,b)->Boolとなって(a,b)->(c,d)->Boolとは型があいませんでした >>254
import Data.Function
groupBy ((==) `on` snd)
結局かっこは使うのだけど、これがあなたの求めるものでしょうか 括弧を使わずにじゃなくてラムダを使わずにでした
まさに欲しかったのそれです
ありがとうございました!! QuickCheckを勉強しているんですが
Runtime Errorを検出したくて次のように書きました
anの要素は2以上n以下で複数回出現します
testcaseがほとんどdiscardされるのですがリストをchoose (2,n)とかで生成するには
どうしたら良いのでしょうか
verboseCheckを指定してみるとskippedだらけなのですが
スキップしたやつは表示しないで欲しい
prop :: Positive Int -> [Int] -> Property
prop (Positive n) an = all (>=2) an && length an == n ==> monadicIO $ do
a' <- run (solve n an)
assert True 岡部健、復活したよ!
エックス内を
“Ken140291“
で探してみて下さい。
最近登録したばかりの様です。 >>248
init $ folfl (\a x -> a++[show x]++“ “) ““ [3,10,1] でOK >260 打ち間違えた!
lnlt$foldl(\a x->a ++show x++" ")[][1,10,3]
が正解。 こんなコードがあるのですが
cumsum k = unfoldr next . (,) 0
where
next :: (Int, [Int]) -> Maybe (Int, (Int, [Int]))
next (acc, x : xs) | acc <= k - x, acc' <- acc + x = Just (acc', (acc', xs))
next _ = Nothing
acc <= k-xはわかるのですが、acc' <- acc + xというのはどういう文法なのですか?
リスト内包表記でもないですし条件式の部分でモナドを扱ってるわけではないですよね? >>267
パターンガードかな
https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%BC%E3%83%89_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0) <-はパターンガード修飾子と呼ぶのですね
初めて知りました
ありがとうございました 毛の壁のTwitterの新しいアカウントは
Ken140291
FPFSstutorial
leadmove3648637
です!! mapAccumL/Rの使いどころがよくわからないのですが
どういう時に使うとかの指針ってありますか? ここ5年で発売されたHaskellの書籍で最も優れたものを紹介してください windowsにインストールできんみたいだなcabalがエラー?
まあwindowsでやるなってことだな モナドについて、床下配線に例えられたり、世界を受け取って副作用後の世界を返すと(IOモナドについて)語られたりするのが当時は分からなくて、考えた結果
何かから値を取り出し、関数適用して(その関数が)何かに値を戻す「動き」をモナドという。
って結論になっていたのだが、IOモナドも含めてもっと良い例えはないかと考えた結果、
モナドとは、アウトソーシング(外部依頼)を数学的に表現したもの。
という結論に至った。
アウトソーシング先が(数学の)外の世界だとIOモナドで、同じ数学の世界だとその他のモナド。
それならHaskell自身は「この関数実行しておいて~」って依頼出して結果を受け取るだけだから、
副作用はないと言う主張に矛盾はない(のか?)
(もしくは、IOモナドはHaskellが受け取れる形の値を返すような入出力の「マシン語」を返してる?)
そう考えると、数学が「数学の外とのやり取り」という概念を獲得したと思うと凄い。 箱の中に処理したいデータが入ってるけど一緒にIOウイルスも入ってて
普通に箱を開けるとIOウイルスが外界に漏れて困るから
もう一回り大きい箱を用意してその中に箱とデータ処理装置を入れて
密封した上で内側の箱を開けてデータを処理する
そうすると箱の中に処理されたデータとIOウイルスが入った状態になる
これを延々と繰り返すのがIOモナド
ずっと前に毒ガスで考えた比喩だけど最近だとこっちだな ふーむ。
仮にアセンブラと1対1に対応したCの関数を全部Haskellから呼べるようにすると、出来ちゃうわけで。
(do形式だとまるっきりアセンブラコードに見えるHaskellコードの出来上がり)
そう考えて私のアウトソーシング説が出来た感じですね。
Haskellがモナドを採用したのは数学(関数型言語だったっけ?)の敗北ってどっかで読みましたし。 doの場合は1行ごとに新しい箱が作られてる
順序はたまに前後するけど内側の箱のデータは外側の箱でしか使えないから
必要な順序は保証される
外界の予測不能な状態を全部1つの箱の中に押し込んで
箱の外側の処理装置製造工場は全部予測可能(純粋)にしてる感じ
数学の敗北の意味はよく分からないけど
実用性のために予測不能な状態を持ち込んだことかな なんか大げさな例えを使いたがるやつが増えたなぁ
コーディングの上でなんの役に立つんだが 「末尾呼び出ししたい関数をデータコンストラクタで置き換える」という仮説は役に立つけれども
(>>=)はコンストラクタではないという事実を見ただけで仮説を捨ててしまうことは科学的によくあること WindowsでghcupをインストールするのにWSLが不要になって
PowerShellだけで導入できるようになってる rustスレで知ったけどhaskellを正格にして依存型を入れたidris(idris2)つー言語があるんだな idrisまで興味があるのならHaskell/Elm/Rust/Zigの流れで開発されているRoc-langも見ておくと良い
特にstatic reference counting周り 色々知らないのがあった、ありがとう
static reference countingつーのが流行りなの
最近のhaskellもrustみたいな1回しかつかえない線形型(linera haskell?)が導入されてるね IOモナドの入力関数も、引数のない関数=変数と捉えると、実質線形型と同じ。
let x = 0 in return (x + 1) >>= x -> print x
こうすると変数xはシャドーイングによって同名の別の変数が生成される。
getLineとかの入力関数はHaskell(数学)の外で初期化される変数とも考えられる。