関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
https://www.haskell.org/
日本Haskellユーザーグループ
https://haskell.jp/
前スレ
関数型プログラミング言語Haskell Part31
https://mevius.5ch.net/test/read.cgi/tech/1506447188/
探検
関数型プログラミング言語Haskell Part32
■ このスレッドは過去ログ倉庫に格納されています
2019/01/29(火) 09:05:47.90ID:gJP/u7IJ
509デフォルトの名無しさん
2019/10/08(火) 21:24:42.66ID:ELFSZFvj >> 505
モナドや高階関数のおかげもあるけど文字数が減るのは
つきつめると言語全体に貫かれた表現の簡潔さ志向の仕様によるかな
参照透過性のおかげで副作用を気にせず共通部分を
気軽に関数としてまとめられるとか
ブロック前後の括弧がいらないとか
再利用や多様な型に適合するように引数や関数の名前を短めにするとか
局所変数がないとか
簡単に二引数の演算子を記号を使って定義できるので
関数名を何度も書かなくて済むとか
いろいろ
書く部分が少なくなるとそれだけケアレスミスの入り込む余地は少なくなるね。
それとS/N比がよくなってロジックを追いやすい。
モナドや高階関数のおかげもあるけど文字数が減るのは
つきつめると言語全体に貫かれた表現の簡潔さ志向の仕様によるかな
参照透過性のおかげで副作用を気にせず共通部分を
気軽に関数としてまとめられるとか
ブロック前後の括弧がいらないとか
再利用や多様な型に適合するように引数や関数の名前を短めにするとか
局所変数がないとか
簡単に二引数の演算子を記号を使って定義できるので
関数名を何度も書かなくて済むとか
いろいろ
書く部分が少なくなるとそれだけケアレスミスの入り込む余地は少なくなるね。
それとS/N比がよくなってロジックを追いやすい。
510デフォルトの名無しさん
2019/10/08(火) 21:32:14.39ID:nLwShu/0 何冊か本を読んだけど、Haskell の気持ちがなかなか分からん…
511デフォルトの名無しさん
2019/10/08(火) 21:39:47.76ID:ELFSZFvj 何か書いてみた?
自分はRWHとかPCHとか読みながらオレオレプロジェクトを仕立てて
書き進めていったらある日を堺に急にこういうことかと理解が進んだ。
自分はRWHとかPCHとか読みながらオレオレプロジェクトを仕立てて
書き進めていったらある日を堺に急にこういうことかと理解が進んだ。
512デフォルトの名無しさん
2019/10/08(火) 22:21:53.53ID:nLwShu/0 やはりどんどん書かないとダメですよね…
おかげさまで、本業とする言語でのコーディングには有意義なフィードバックができてはいるのですが
そもそも GHC が吐き出すエラーメッセージがなぁ〜
おかげさまで、本業とする言語でのコーディングには有意義なフィードバックができてはいるのですが
そもそも GHC が吐き出すエラーメッセージがなぁ〜
513デフォルトの名無しさん
2019/10/08(火) 23:04:55.55ID:ELFSZFvj 自分もエラーが何を意味しているのか最初はわからなかった。
ただほとんどのエラーは型の不一致由来。
だから何行目のどこでエラーが出ているかだけわかればあとは
型を順番に調べていって解決できるようになった。
スペルを間違えたり似たような目的で使う別の型と勘違いしていたり
とかそれなりの理由でエラーが出ているはず。後者は代数データ型を
適当にその場で作ったりしてた頃によくやってた。
ただほとんどのエラーは型の不一致由来。
だから何行目のどこでエラーが出ているかだけわかればあとは
型を順番に調べていって解決できるようになった。
スペルを間違えたり似たような目的で使う別の型と勘違いしていたり
とかそれなりの理由でエラーが出ているはず。後者は代数データ型を
適当にその場で作ったりしてた頃によくやってた。
514デフォルトの名無しさん
2019/10/08(火) 23:09:06.98ID:DA/zVK7z LispとHaskellの間には謎の暗黒時代があるから
結果がすべての人にはそれがわからんのです
結果がすべての人にはそれがわからんのです
515デフォルトの名無しさん
2019/10/08(火) 23:13:57.88ID:ELFSZFvj その暗黒時代にSMLの本を店頭で見かけて気になった記憶がある。
結局買わなくていきなり普通のHaskellまでとんだ。
ソースから実行コードにどんなふうにおとしていってるのか最近
気になってきたのでそのうち古本でMLの本でも手に入れるか
GHCのが吐くコードを追っかけてみたい。
結局買わなくていきなり普通のHaskellまでとんだ。
ソースから実行コードにどんなふうにおとしていってるのか最近
気になってきたのでそのうち古本でMLの本でも手に入れるか
GHCのが吐くコードを追っかけてみたい。
516デフォルトの名無しさん
2019/10/08(火) 23:33:07.01ID:nLwShu/0517デフォルトの名無しさん
2019/10/08(火) 23:42:31.20ID:ELFSZFvj どういたしまして!
基本文法は簡単だから文法エラーはすぐにほとんど出なくなります。
そこまでいったら初級編終了。
基本文法は簡単だから文法エラーはすぐにほとんど出なくなります。
そこまでいったら初級編終了。
518デフォルトの名無しさん
2019/10/09(水) 00:44:23.02ID:UKqTo/lR 圏論の本を読もうと思ったら数学地獄にはまる
519デフォルトの名無しさん
2019/10/09(水) 22:12:42.71ID:wrHKsVK1 VIMで関数名にカーソル合わせると自動で型シグネチャ動的推論して表示してくれる機能ありませんか?
520デフォルトの名無しさん
2019/10/10(木) 00:08:02.64ID:TcPJYaG5 ダイクストラのアルゴリズム
優先度付きキューの手作りから始めて一週間かかってやっと完成した
あたまわーるわるわーるーわる〜♪
sm32181836
脳裏に流れてる
優先度付きキューの手作りから始めて一週間かかってやっと完成した
あたまわーるわるわーるーわる〜♪
sm32181836
脳裏に流れてる
521デフォルトの名無しさん
2019/10/10(木) 09:37:00.35ID:yMym0WfO 善意的に解釈してアルゴリズムの方の動画だと思ったが
案の定あたまわるい方の動画だった
案の定あたまわるい方の動画だった
522デフォルトの名無しさん
2019/10/10(木) 19:26:23.87ID:yuHTWGdR practical haskell second edition読み終わった
523デフォルトの名無しさん
2019/10/11(金) 18:25:28.60ID:NJkU4MQ7 Haskell Wiki
!haskellwiki
Hayoo
!hayoo
Hoogle
!h
Hackage
!hkg
Hoogle at Stackage
!stackage
https://duckduckgo.com/bang?c=Tech&sc=Languages+(Haskell)
!haskellwiki
Hayoo
!hayoo
Hoogle
!h
Hackage
!hkg
Hoogle at Stackage
!stackage
https://duckduckgo.com/bang?c=Tech&sc=Languages+(Haskell)
524デフォルトの名無しさん
2019/10/11(金) 20:15:13.77ID:NJkU4MQ7525デフォルトの名無しさん
2019/10/12(土) 00:29:02.70ID:mt88ZJv+ >>510
mylist 3 = [[1,2,3],[4,5,6],[7,8,9]]
みたいなリストを作る関数をHaskellで作ってみれば関数脳に目覚める。
割とマジで。
Haskell入門以前って電子書籍で書いたが、自力で目覚めるなら買わなくても良い。
(Haskell入門書読んでも宣言的とは?関数脳とは?がピンと来なかった経験から書いた)
mylist 3 = [[1,2,3],[4,5,6],[7,8,9]]
みたいなリストを作る関数をHaskellで作ってみれば関数脳に目覚める。
割とマジで。
Haskell入門以前って電子書籍で書いたが、自力で目覚めるなら買わなくても良い。
(Haskell入門書読んでも宣言的とは?関数脳とは?がピンと来なかった経験から書いた)
526デフォルトの名無しさん
2019/10/12(土) 00:42:17.63ID:67yl+yJ3 パッと思いついたのはこんな感じ?
添削してくれたら嬉しい
HaskellでなくPureScriptだが
mylist :: Int -> Array (Array Int)
mylist n = do
i <- 1..n
pure [i*3 + 1, i*3 + 2, i*3 + 3]
添削してくれたら嬉しい
HaskellでなくPureScriptだが
mylist :: Int -> Array (Array Int)
mylist n = do
i <- 1..n
pure [i*3 + 1, i*3 + 2, i*3 + 3]
527デフォルトの名無しさん
2019/10/12(土) 01:48:37.28ID:gzpbrH7N528デフォルトの名無しさん
2019/10/12(土) 02:00:10.51ID:iYZ0+U57 >>527
うーん・・・。
貴方はまだ手続き脳ですね。
(その手順でも関数脳を実感する人は実感するのでしょうが)
罰としてHaskell入門以前をご購入下さい。
IOの純粋は、「プログラマーのための圏論」と言うPDFがネットにあるのでググって読んでみると良いです。
うーん・・・。
貴方はまだ手続き脳ですね。
(その手順でも関数脳を実感する人は実感するのでしょうが)
罰としてHaskell入門以前をご購入下さい。
IOの純粋は、「プログラマーのための圏論」と言うPDFがネットにあるのでググって読んでみると良いです。
529デフォルトの名無しさん
2019/10/12(土) 02:20:05.14ID:CTFV4tiX (n: number) => Array.from(Array(n).keys()).map(
i => Array.from(Array(n).keys()).map(
j => n * i + j + 1
)
)
i => Array.from(Array(n).keys()).map(
j => n * i + j + 1
)
)
530デフォルトの名無しさん
2019/10/12(土) 02:25:29.50ID:gzpbrH7N531デフォルトの名無しさん
2019/10/12(土) 02:33:17.76ID:gzpbrH7N532デフォルトの名無しさん
2019/10/12(土) 08:28:10.44ID:oBt8QHPo >>530
ちょっとchopと[1..]から離れましょう。
そして、[1..n]に何をすれば次のリストを得られるか考えましょう。
プレリュードの(入門以前と書かれた通り)基本関数の組み合わせだけで書けます。
IOと言うより入力ですが、関数の引数か、外部からの入力かだけで中身の処理は普通の関数と同じと捉えましょう。
そうするとreadLine関数が部分適用で見た目の引数の減った普通の関数に見えて来ませんか?
圏論で謳っているのは、どこから来たかが違っていても同じ事をするなら、同じ関数と見なそう。
そう言う、ある着目点以外の差異を無いものとするという事です。
ちょっとchopと[1..]から離れましょう。
そして、[1..n]に何をすれば次のリストを得られるか考えましょう。
プレリュードの(入門以前と書かれた通り)基本関数の組み合わせだけで書けます。
IOと言うより入力ですが、関数の引数か、外部からの入力かだけで中身の処理は普通の関数と同じと捉えましょう。
そうするとreadLine関数が部分適用で見た目の引数の減った普通の関数に見えて来ませんか?
圏論で謳っているのは、どこから来たかが違っていても同じ事をするなら、同じ関数と見なそう。
そう言う、ある着目点以外の差異を無いものとするという事です。
533デフォルトの名無しさん
2019/10/12(土) 11:27:51.29ID:/Y14moqf >>510 です
mylist n = take n $ f [[1..n]]
where
f [ns] = ns : f [g ns]
g ns = map (+3) ns
としたところで、要素に f を繰り返し適用して無限リストを作る関数があることを思い出し、思い出せずにカンニングして iterate を発見
mylist n = take n $ iterate f [1..n]
where
f ns = map (+n) ns
map (+n) 辺りがどうも…
mylist n = take n $ f [[1..n]]
where
f [ns] = ns : f [g ns]
g ns = map (+3) ns
としたところで、要素に f を繰り返し適用して無限リストを作る関数があることを思い出し、思い出せずにカンニングして iterate を発見
mylist n = take n $ iterate f [1..n]
where
f ns = map (+n) ns
map (+n) 辺りがどうも…
534デフォルトの名無しさん
2019/10/12(土) 11:28:38.29ID:/Y14moqf インデントの空白が消えるのか
535デフォルトの名無しさん
2019/10/12(土) 11:30:28.30ID:/Y14moqf 間違えた、先の関数の (+3) は (+n) でした
536デフォルトの名無しさん
2019/10/12(土) 14:40:27.19ID:IkOZzxfL 文字数が減る主義を粛清した結果がこの関数脳内革命なのか?
文字数が減るでよかったのに
文字数が減るでよかったのに
537デフォルトの名無しさん
2019/10/12(土) 19:37:37.13ID:Qwy8j330538デフォルトの名無しさん
2019/10/13(日) 08:24:39.79ID:joWtBDzr 競プロでもあるまいしアルゴリズムを非直観的なものに変形させる必要がどこにある?
そんなに漸化式が好きなら iterate (\xs -> [last xs+1,last xs+2..last xs+n]) でもやってろ
そんなに漸化式が好きなら iterate (\xs -> [last xs+1,last xs+2..last xs+n]) でもやってろ
539デフォルトの名無しさん
2019/10/13(日) 12:28:55.45ID:vnXjj3sR プログラミング運算やると計算量がオーダーレベルで変わるよみたいな話もあるから
非直感的な宣言をすることがいつも無駄とは限らないだろう
今スレで話題になってる例が教育的によいかどうかはわからんが
非直感的な宣言をすることがいつも無駄とは限らないだろう
今スレで話題になってる例が教育的によいかどうかはわからんが
540デフォルトの名無しさん
2019/10/13(日) 12:35:18.14ID:rWBm0O/W 効率的な計算量になるようにコンピュータが計算して最適化してくれたらいいのに
541デフォルトの名無しさん
2019/10/13(日) 14:20:50.34ID:8ABqNncq なにしてんの
mylist n = [ [(m - 1) * n + 1 .. m * n] | m <- [1 .. n] ]
とかじゃだめなの
mylist n = [ [(m - 1) * n + 1 .. m * n] | m <- [1 .. n] ]
とかじゃだめなの
542デフォルトの名無しさん
2019/10/13(日) 14:25:29.07ID:8ABqNncq ただでさえO(n^2)なのにiterateとかやったらO(n^3)じゃん
543デフォルトの名無しさん
2019/10/13(日) 15:19:23.66ID:joWtBDzr mylist n = take n $ chunksOf n [1..]
がダメらしいからそれもダメなんじゃない?知らないけど
がダメらしいからそれもダメなんじゃない?知らないけど
544デフォルトの名無しさん
2019/10/14(月) 07:17:52.00ID:Foao1gEl545デフォルトの名無しさん
2019/10/14(月) 13:10:48.92ID:dTytwEqk n個の品物が入るナップサックがn個あって
1,2,3...と番号の書かれた品物を順番にいれていく
等々いくらでも行動的比喩が可能な問題に対して数式的に考えることが自然ねぇ・・・
まあ人間の思考傾向を議論するつもりはないけど
少し考えればシンプルに解ける問題は少し考えろと主張をしたいんだとしても
我々手続き的ゾンビにとってmylistの例が「直観性」を犠牲にするほどシンプルだとは思えないけどね
1,2,3...と番号の書かれた品物を順番にいれていく
等々いくらでも行動的比喩が可能な問題に対して数式的に考えることが自然ねぇ・・・
まあ人間の思考傾向を議論するつもりはないけど
少し考えればシンプルに解ける問題は少し考えろと主張をしたいんだとしても
我々手続き的ゾンビにとってmylistの例が「直観性」を犠牲にするほどシンプルだとは思えないけどね
546デフォルトの名無しさん
2019/10/15(火) 00:51:42.29ID:ojqSK/Hb チューリング完全なもの同士は等価である
Haskellと他の言語が等価であることを直感的に表現しているのがモナドだ
この文脈ではモナドが直感的だと思わない奴の直感はあてにならない
プログラミング未経験者ってのは文脈無視するのを正当化するための道具にされてるだけだろう
Haskellと他の言語が等価であることを直感的に表現しているのがモナドだ
この文脈ではモナドが直感的だと思わない奴の直感はあてにならない
プログラミング未経験者ってのは文脈無視するのを正当化するための道具にされてるだけだろう
547デフォルトの名無しさん
2019/10/15(火) 08:43:19.81ID:NwqFzBSd 隠そうとして隠し切れなかったのがモナド
548デフォルトの名無しさん
2019/10/16(水) 01:24:19.49ID:N7kCHTAD モナドっていうネーミングも謎
549デフォルトの名無しさん
2019/10/16(水) 01:58:12.16ID:1kZaANyW ニョモレとかムニャンプの方が良かった?
550デフォルトの名無しさん
2019/10/16(水) 02:26:39.80ID:lWzU93N+ モノ モノイド
551デフォルトの名無しさん
2019/10/16(水) 22:21:13.29ID:N7kCHTAD モナド=単一子=世界の究極の根本要素
でもHaskellのモナドは外部とのやり取りを隠蔽してる脇役みたいなものでしょ
でもHaskellのモナドは外部とのやり取りを隠蔽してる脇役みたいなものでしょ
552デフォルトの名無しさん
2019/10/16(水) 22:25:37.91ID:S+gc310a 無理やり型合わせするためだけの言い訳だな。
くっだらねーとしか思わんかったわ。
くっだらねーとしか思わんかったわ。
553デフォルトの名無しさん
2019/10/16(水) 23:44:14.52ID:5hxXU1b8 そう思ってでもまだこちらをのぞいているってことは
かなり気に入る・気になる部分もあったんだよね。
どんなところがよかったの?あるいは気になったの?
かなり気に入る・気になる部分もあったんだよね。
どんなところがよかったの?あるいは気になったの?
554デフォルトの名無しさん
2019/10/17(木) 03:04:05.52ID:Xwvn1Enx CSで使われる用語って何かのめたふぁか知らんけど
無理に数学に合わせて造語っててかえって判り難さが増すというね
無理に数学に合わせて造語っててかえって判り難さが増すというね
555デフォルトの名無しさん
2019/10/17(木) 03:47:00.30ID:qaCXzdDd モナドが分からんという人が多いのは
哲学のモナドと混同してるからだろうな
全く無関係の別物だと理解する必要がある
哲学のモナドと混同してるからだろうな
全く無関係の別物だと理解する必要がある
556デフォルトの名無しさん
2019/10/17(木) 04:08:11.17ID:UnH0fUML いやそれはない
557デフォルトの名無しさん
2019/10/17(木) 06:05:35.66ID:gq3I2ckq モナドはわかっても何が凄いのか全然わからん教えてくれ
558デフォルトの名無しさん
2019/10/17(木) 07:39:25.89ID:fFU5Cjed 哲学と数学の違いは「嘘を言ってはいけない」という点にどこまで集中するかの違い
すごいものを作るより有害なものを作らないことをどのぐらい重視するか
すごいものを作るより有害なものを作らないことをどのぐらい重視するか
559デフォルトの名無しさん
2019/10/17(木) 08:37:09.64ID:n/9LzeKG たしかにモナドすごいすごいって言う人っていざ説明させると説明できないよねw
せいぜい受け売り止まり
せいぜい受け売り止まり
560デフォルトの名無しさん
2019/10/17(木) 09:27:30.90ID:PVi4YySF では説明お願いします
561デフォルトの名無しさん
2019/10/17(木) 09:56:17.77ID:Gwz4u+oG 受け売り止まりじゃない説明はよ
562デフォルトの名無しさん
2019/10/17(木) 10:16:38.68ID:kLoaz8mV モナドはただのデザインパターンの一つだろ
563デフォルトの名無しさん
2019/10/17(木) 10:44:35.23ID:n/9LzeKG564デフォルトの名無しさん
2019/10/17(木) 10:44:48.97ID:UnH0fUML モナドほどの抽象化しただけで画期的じゃん
イテレータとか用意してデータ構造によらないコンテナへの共通インタフェースとさらにそれへの特別なシンタックスシュガー用意した言語ぐらいならあった
モナドなんか用意してdo記法なんてシンタックスシュガー用意してプログラミング言語における手続き的処理やその他諸々を抽象化した
イテレータとか用意してデータ構造によらないコンテナへの共通インタフェースとさらにそれへの特別なシンタックスシュガー用意した言語ぐらいならあった
モナドなんか用意してdo記法なんてシンタックスシュガー用意してプログラミング言語における手続き的処理やその他諸々を抽象化した
565デフォルトの名無しさん
2019/10/17(木) 10:57:50.46ID:8XbgiZIP 抽象化できてるか?
手続き型と同じっぽく見えるけど、いざ活用しようとすると同じようには使えなくて意味不明な型エラーで詰まる
結局のところモナドの仕組み理解できてないと使いこなせない
これは抽象化できてないってことでしょ
手続き型と同じっぽく見えるけど、いざ活用しようとすると同じようには使えなくて意味不明な型エラーで詰まる
結局のところモナドの仕組み理解できてないと使いこなせない
これは抽象化できてないってことでしょ
566デフォルトの名無しさん
2019/10/17(木) 11:46:58.33ID:UnH0fUML そりゃ任意の手続き型言語を再現できるわけではないから完全な抽象化ではないけど
手続き型的な処理とか、失敗する可能性のある処理とか、非決定的処理だとか、そう言った諸々をまとめてモナドとして一般化してる
そのおかげでそれら全てで共通にdo記法やモナド向けの関数といったものが使えて、各種毎に個別に関数を用意したり覚えたりする必要が減る
自作のDSLなどを構築するときにも
モナドインタフェースを実装するだけでdo記法やモナド向け関数群を使えるようになる
他言語でDSL構築は結構大変だし、オレオレDSLなんてどういう仕様かわかりにくいけど、haskellなら型から検索したり型を見たりすることでどういうアクションがあってどうやって使うのかがわかる
手続き型的な処理とか、失敗する可能性のある処理とか、非決定的処理だとか、そう言った諸々をまとめてモナドとして一般化してる
そのおかげでそれら全てで共通にdo記法やモナド向けの関数といったものが使えて、各種毎に個別に関数を用意したり覚えたりする必要が減る
自作のDSLなどを構築するときにも
モナドインタフェースを実装するだけでdo記法やモナド向け関数群を使えるようになる
他言語でDSL構築は結構大変だし、オレオレDSLなんてどういう仕様かわかりにくいけど、haskellなら型から検索したり型を見たりすることでどういうアクションがあってどうやって使うのかがわかる
567デフォルトの名無しさん
2019/10/17(木) 11:49:22.03ID:fFU5Cjed これがC++だったらJavaScript環境を作ってC++の仕組みを隠蔽するかもな
Haskellでも同じことをする自由はある
Haskellでも同じことをする自由はある
568デフォルトの名無しさん
2019/10/17(木) 21:34:43.47ID:AvAuJv6u 関数脳になるとどんな利点があるのかな?
手続記述は使い回ししにくい?
参照透過性が確保されていて型の情報があれば
算法の記法が手続き的か定義的かを問わず
どちらでもいいような気もするが
手続記述は使い回ししにくい?
参照透過性が確保されていて型の情報があれば
算法の記法が手続き的か定義的かを問わず
どちらでもいいような気もするが
569デフォルトの名無しさん
2019/10/18(金) 00:47:49.97ID:Jux/affY570デフォルトの名無しさん
2019/10/18(金) 06:44:38.21ID:lM5JoyFV >>562
絶対違う
絶対違う
571デフォルトの名無しさん
2019/10/18(金) 09:49:47.43ID:F+Okgjq/ >>569
全然違うんだよなぁ…
全然違うんだよなぁ…
572デフォルトの名無しさん
2019/10/18(金) 12:21:22.11ID:cHgwfEPK コンストラクターがオーバーロードできないから別の列挙型に同じタグ名がつけれないんだけど
どうしたらいい?
どうしたらいい?
573デフォルトの名無しさん
2019/10/18(金) 12:40:18.58ID:B/ouUg1P574デフォルトの名無しさん
2019/10/18(金) 12:41:41.68ID:B/ouUg1P >>572
自分だったら根本的な構造を見直すかな
自分だったら根本的な構造を見直すかな
575デフォルトの名無しさん
2019/10/18(金) 17:04:05.16ID:lM5JoyFV >>574
kwsk
kwsk
576デフォルトの名無しさん
2019/10/18(金) 20:30:34.81ID:O9SciFl2 >>572
DuplicateRecordFields 拡張を使うとできるようになるっぽいよ。
http://lotz84.github.io/haskell/extensible-record.html
DuplicateRecordFields 拡張を使うとできるようになるっぽいよ。
http://lotz84.github.io/haskell/extensible-record.html
577デフォルトの名無しさん
2019/10/18(金) 20:44:14.39ID:lM5JoyFV >>576
俺も一瞬それ思ったけど同名データコンストラクタもできたっけ?
俺も一瞬それ思ったけど同名データコンストラクタもできたっけ?
578デフォルトの名無しさん
2019/10/18(金) 21:22:19.66ID:O9SciFl2 >>577
コンストラクタの方か。見間違えてた
コンストラクタの方か。見間違えてた
579デフォルトの名無しさん
2019/10/18(金) 22:18:25.57ID:O9SciFl2 data 宣言を別モジュールに分けて
両方が必要なら import ... as ... で別名をつけるって方法はどう?
両方が必要なら import ... as ... で別名をつけるって方法はどう?
580デフォルトの名無しさん
2019/10/18(金) 22:56:52.03ID:liCy40EB モナドを導入することで副作用のない
「副作用のチェーンをつくって渡す。」
ちなみに実行は副作用させるというバカみたいなレトリックを実行してるだけ。
バカはそういうものをありがたがるんだよ。
そしてそういうものをありがたがるというのはバカみたいに本質なんだな。
「副作用のチェーンをつくって渡す。」
ちなみに実行は副作用させるというバカみたいなレトリックを実行してるだけ。
バカはそういうものをありがたがるんだよ。
そしてそういうものをありがたがるというのはバカみたいに本質なんだな。
581デフォルトの名無しさん
2019/10/18(金) 23:39:51.57ID:CSj9zhCF モナドのごとく回りくどく分かりにくい文だな
582デフォルトの名無しさん
2019/10/19(土) 00:07:09.37ID:0X24TT// >>575
Haskellは個人の趣味・自己啓発の道具の範疇なので
参考にならないでしょうが…
名前がかぶるのはどこか機能がかぶってたりするかなと
型の使い方を見直したり組み合わせる関数を見直したり
所属するモジュールを移動したりとか。
どうしても名前がかぶるってときは英語名や日本語名
ときには中国語とかも借用する(ただし英字を使う
ローマ字やピンイン表記)か密接に関係する事柄の
接頭辞をつけてる。
Haskellは個人の趣味・自己啓発の道具の範疇なので
参考にならないでしょうが…
名前がかぶるのはどこか機能がかぶってたりするかなと
型の使い方を見直したり組み合わせる関数を見直したり
所属するモジュールを移動したりとか。
どうしても名前がかぶるってときは英語名や日本語名
ときには中国語とかも借用する(ただし英字を使う
ローマ字やピンイン表記)か密接に関係する事柄の
接頭辞をつけてる。
583デフォルトの名無しさん
2019/10/19(土) 00:15:25.34ID:0X24TT// >>580
モナドで副作用・副作用もどきを扱えるけど
モナドの全てが副作用・副作用もどきを伴う
わけではないでしょ。
リストもMaybeもEitherもモナドとして扱う
定義はされているが別にそれをつなげても
副作用があるわけでなし。
モナドで副作用・副作用もどきを扱えるけど
モナドの全てが副作用・副作用もどきを伴う
わけではないでしょ。
リストもMaybeもEitherもモナドとして扱う
定義はされているが別にそれをつなげても
副作用があるわけでなし。
584デフォルトの名無しさん
2019/10/20(日) 21:44:47.02ID:5Lp8lBZ6 非決定計算やIOが同じモナドというククリで実現できるのが大変興味深いです
585デフォルトの名無しさん
2019/10/20(日) 23:54:14.30ID:Wg020iKs なぜそんなにお前らがモナドについてあーでもないこーでもないと話し合ってるのかがわからない
モナドなんていたってシンプルな考え方なのに
モナドなんて単純にどうやって関数を合成するかというルールにすぎない
より正確には、「モナディックな関数」を合成するルール
では、モナディックな関数とは?それは"装飾された値"を返す関数のこと。
どんな装飾が施されたかについては、文脈によって様々だが、たとえば…
・エラー -> 失敗を表すデータもとりうる値 MaybeとかEither Error
・非決定性 -> いくつもの値を同時に表す値 List, Array
・副作用 -> 副作用自体を表すデータ Effect, Aff
・状態を扱う -> 状態を表すデータとセットになった値 Reader , Writer, State
モナドなんていたってシンプルな考え方なのに
モナドなんて単純にどうやって関数を合成するかというルールにすぎない
より正確には、「モナディックな関数」を合成するルール
では、モナディックな関数とは?それは"装飾された値"を返す関数のこと。
どんな装飾が施されたかについては、文脈によって様々だが、たとえば…
・エラー -> 失敗を表すデータもとりうる値 MaybeとかEither Error
・非決定性 -> いくつもの値を同時に表す値 List, Array
・副作用 -> 副作用自体を表すデータ Effect, Aff
・状態を扱う -> 状態を表すデータとセットになった値 Reader , Writer, State
586デフォルトの名無しさん
2019/10/21(月) 00:25:00.67ID:4Py1bsIM シンプルな考え方合成ルールといいつつ
肝心のルールの中身を説明しないで
利点や応用分野のみ紹介する
典型的な日本人話法
モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?
肝心のルールの中身を説明しないで
利点や応用分野のみ紹介する
典型的な日本人話法
モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?
587デフォルトの名無しさん
2019/10/21(月) 00:50:05.83ID:tyOGJJBt いやだから装飾のされ方は物によって様々だって言ってるじゃん
ルールの中身も当然装飾のされ方によって様々なんだから画一的に述べられないってわからないか?
一つ言えるのはbindとpureの定義を与えるってことくらいだが
あるいは同値な定義だが、関手であることを要請した上でjoinとreturnを与えるのでも構わない
数学者のモナドの定義を述べているお前ならこっちのほうが好みかもな
ルールの中身も当然装飾のされ方によって様々なんだから画一的に述べられないってわからないか?
一つ言えるのはbindとpureの定義を与えるってことくらいだが
あるいは同値な定義だが、関手であることを要請した上でjoinとreturnを与えるのでも構わない
数学者のモナドの定義を述べているお前ならこっちのほうが好みかもな
588デフォルトの名無しさん
2019/10/21(月) 11:02:55.47ID:Spzp+9MC 「自己関手の圏」の中身を説明しないからわけがわからない
関手の合成は積?
恒等関手は単位対象だが終対象ではない?
うっかり始対象になったりしたらそれ積じゃなくて和じゃないか
関手の合成は積?
恒等関手は単位対象だが終対象ではない?
うっかり始対象になったりしたらそれ積じゃなくて和じゃないか
589デフォルトの名無しさん
2019/10/21(月) 12:39:15.34ID:4Py1bsIM 中身は数学で明示されてるのでは
590デフォルトの名無しさん
2019/10/21(月) 14:07:32.87ID:Fq1X48Cm 自己関手の圏におけるモノイド対象としてモナドを理解することは、必ずしもプログラミングのためになるものではないから必須ではない。
それでもそれを理解したいのであれば、プログラミングの文脈で理解するのではなくて、ちゃんと圏論の文脈で理解した方がいい。
Bartosz MilewskiのCategory theory for programmerがわかりやすくておすすめ。
それでもそれを理解したいのであれば、プログラミングの文脈で理解するのではなくて、ちゃんと圏論の文脈で理解した方がいい。
Bartosz MilewskiのCategory theory for programmerがわかりやすくておすすめ。
591デフォルトの名無しさん
2019/10/21(月) 14:17:03.91ID:2JzHnDoh 【僕用メモ】
・bind と pure の定義を与える
・関手であることを要請した上で join と return の定義を与える
両者は同値である。
・bind と pure の定義を与える
・関手であることを要請した上で join と return の定義を与える
両者は同値である。
592デフォルトの名無しさん
2019/10/21(月) 14:44:27.76ID:VTam/Iyy だめな理系人間の特徴
初学者に対してひたすらwhatを説明
だいたいコミュ障を併発してる
初学者に対してひたすらwhatを説明
だいたいコミュ障を併発してる
593デフォルトの名無しさん
2019/10/21(月) 14:53:31.64ID:c9dhXgWB594デフォルトの名無しさん
2019/10/21(月) 15:19:59.07ID:ZzgPuxVR >>593
そうでもなくね? っていうか内容がHaskellに関係なかったw
そうでもなくね? っていうか内容がHaskellに関係なかったw
595デフォルトの名無しさん
2019/10/21(月) 15:38:45.76ID:E4DE6I01 お前らって圏論なにで勉強したの
英語の本読んだの?大学の授業とかで習ったの?
英語の本読んだの?大学の授業とかで習ったの?
596デフォルトの名無しさん
2019/10/21(月) 15:49:09.35ID:niRnsl0k 数学の本買って独学
597デフォルトの名無しさん
2019/10/21(月) 16:22:57.20ID:5+ah6i6T 知らん用語が出て来るから初学者で戸惑う人が多いだろうが
内容は小学生でも理解出来るレベル
内容は小学生でも理解出来るレベル
598デフォルトの名無しさん
2019/10/21(月) 16:52:11.20ID:D03iscrb Basic Category Theory, Tom Leinster
英語で読んだ
英語で読んだ
>>598
翻訳でもない和書ってありませんかね…
翻訳でもない和書ってありませんかね…
600デフォルトの名無しさん
2019/10/22(火) 02:26:17.25ID:Y6ckqEQv >>595
数学教室 πの焼き方と、プログラマーのための圏論。
ただ、読んだ後に意味を吟味して閃きが必要だった。
まず普通の関数とモナドな関数を同じと見做す考え。
IOモナドの入力は基本、文字列を受け取るので数文字列を受け取って、整数に変換後2倍する関数を作るとする。
getLine >>= \s -> return $ 2 * read s
これと同じ効果の普通の関数を作ってみる。
getLine’ s = 2 * read s
このgetLineとgetLine’をそれぞれ部分適用で見かけの変数を減らす形に変形。
getLine >>= return.(2*).read
getLine’ = (2*).read
この場合、2つの関数は型と引数からの入力か入力装置からの入力かしか違いがない。
関数の中身から見れば、いつ、どんな文字列が来るか分からない。同じ数文字列が来たら同じ結果を返すと言う意味では同じと見なせる。
数学教室 πの焼き方と、プログラマーのための圏論。
ただ、読んだ後に意味を吟味して閃きが必要だった。
まず普通の関数とモナドな関数を同じと見做す考え。
IOモナドの入力は基本、文字列を受け取るので数文字列を受け取って、整数に変換後2倍する関数を作るとする。
getLine >>= \s -> return $ 2 * read s
これと同じ効果の普通の関数を作ってみる。
getLine’ s = 2 * read s
このgetLineとgetLine’をそれぞれ部分適用で見かけの変数を減らす形に変形。
getLine >>= return.(2*).read
getLine’ = (2*).read
この場合、2つの関数は型と引数からの入力か入力装置からの入力かしか違いがない。
関数の中身から見れば、いつ、どんな文字列が来るか分からない。同じ数文字列が来たら同じ結果を返すと言う意味では同じと見なせる。
601デフォルトの名無しさん
2019/10/22(火) 02:26:29.61ID:Y6ckqEQv そして、圏論の主張は変数は引数無しの関数でも有ると言う事。
以下は関数である。
f x = 2 * x
しかし、部分適用されたカリー化関数は関数でもあり、変数でもある。
f = (2*) (関数でもあり、関数という値を返す変数でもある)
すなわち、x = 1のようなただの変数も、つねに1を返すxと言う引数の無い関数と見なせる。
x = 1 (1と言う値の入った変数であり、常に1を返す引数無しの関数でもある)
Haskellでは表現できないものの、さらに言えば数そのものも圏論では値であり、変数であり、関数である。
単純に書くと以下の通りだが、
1 = 1
ペアノの公理(ペアノ数)を使った方が概念的に分かりやすいかも知れない。
data Nat = Zero | Succ Nat
1 = Succ Zero
以下は関数である。
f x = 2 * x
しかし、部分適用されたカリー化関数は関数でもあり、変数でもある。
f = (2*) (関数でもあり、関数という値を返す変数でもある)
すなわち、x = 1のようなただの変数も、つねに1を返すxと言う引数の無い関数と見なせる。
x = 1 (1と言う値の入った変数であり、常に1を返す引数無しの関数でもある)
Haskellでは表現できないものの、さらに言えば数そのものも圏論では値であり、変数であり、関数である。
単純に書くと以下の通りだが、
1 = 1
ペアノの公理(ペアノ数)を使った方が概念的に分かりやすいかも知れない。
data Nat = Zero | Succ Nat
1 = Succ Zero
602デフォルトの名無しさん
2019/10/22(火) 03:15:18.03ID:Id5sXRgE603デフォルトの名無しさん
2019/10/22(火) 07:00:59.60ID:bWQbmCi2 >>590
youtubeにある彼のビデオレクチャーも良いよ
youtubeにある彼のビデオレクチャーも良いよ
604デフォルトの名無しさん
2019/10/22(火) 11:37:49.35ID:QfoZv31s モノイドのところがよくわからんかったけど読み物として面白かった
https://chrispenner.ca/posts/wc
https://chrispenner.ca/posts/wc
605デフォルトの名無しさん
2019/10/22(火) 13:56:22.87ID:bWQbmCi2606デフォルトの名無しさん
2019/10/22(火) 21:21:34.69ID:r5HMg/cf >>601
>数そのものも圏論では値であり、変数であり、関数である。
もしその様な表現が可能な拡張がされた場合何が起きる出来るんですか?
数値に新規の型を設定して値で変数で関数みたいな扱い出来ないかな
>数そのものも圏論では値であり、変数であり、関数である。
もしその様な表現が可能な拡張がされた場合何が起きる出来るんですか?
数値に新規の型を設定して値で変数で関数みたいな扱い出来ないかな
607デフォルトの名無しさん
2019/10/22(火) 21:31:09.36ID:mzkWHCb9 圏論うろおぼえだけどそれって圏論の範疇だっけ?
圏論ってマッピングする理論であってその対象が値か関数か変数か関知しないのでは?
値が関数ってのはラムダ計算から来るものでしょ
確かにそれらを組み合わせて計算理論になるわけだけど
圏論ってマッピングする理論であってその対象が値か関数か変数か関知しないのでは?
値が関数ってのはラムダ計算から来るものでしょ
確かにそれらを組み合わせて計算理論になるわけだけど
608デフォルトの名無しさん
2019/10/23(水) 02:22:17.73ID:yKBkbeD2 >>601
お前が圏論を全く理解していないことは良くわかった
圏論には「関数」とか「値」とか「変数」といった概念はない
「対象」と「射」との2つの概念があるだけだ
だからお前の次の
>数そのものも圏論では値であり、変数であり、関数である
これは単なる間違いさえ通り越して全くのナンセンス
圏論には値も変数も関数も存在しないのだから
何を対象として何を射とするかは個々の具体的な圏によって異なる
お前が圏論を全く理解していないことは良くわかった
圏論には「関数」とか「値」とか「変数」といった概念はない
「対象」と「射」との2つの概念があるだけだ
だからお前の次の
>数そのものも圏論では値であり、変数であり、関数である
これは単なる間違いさえ通り越して全くのナンセンス
圏論には値も変数も関数も存在しないのだから
何を対象として何を射とするかは個々の具体的な圏によって異なる
609デフォルトの名無しさん
2019/10/23(水) 02:25:20.92ID:yKBkbeD2■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★9 [ぐれ★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 ★2 [ぐれ★]
- 「町中華」の“息切れ倒産”が増加 ブームにも支えられ職人技で踏ん張ってきたが… 大手チェーンは値上げでも絶好調 [ぐれ★]
- 毛寧(もう・ねい)報道官「中国に日本の水産品の市場は無い」 高市首相の国会答弁に「中国民衆の強い怒り」 ★2 [ぐれ★]
- 【高市核兵器】 小泉コメ防衛大臣「民主党政権 岡田外務大臣の “非核三原則” に関する国会答弁を引き継いでいる」 政策堅持を明言 [485983549]
- 【高市賃上げ】 自民党&維新の会「国会議員の給与を 月5万円アップさせる!」 今国会で歳費法改正。 月129万円→月134万円に [485983549]
- 【高市会談】 長年、日本初の女性首相を目指し争った 百合子と早苗「国と都の補正予算で連携するわよ!」 首相官邸で初会談 [485983549]
- Apple Arcade凄い。ゲーム遊び放題。言うなればゲームの食べ放題。サブスク
- 犯罪者たち「刑事罰受けて罪は償った!被害者への賠償金?もう反省済みだから一円も払わねーよばーかwww」 [177178129]
- ㊗157円 [194819832]
