関数型プログラミング言語Haskell Part31©2ch.net

レス数が950を超えています。1000を超えると書き込みができなくなります。
2017/09/27(水) 02:33:08.70ID:2XAqPuH2
関数型プログラミング言語 Haskell について語るスレです。

haskell.org (公式サイト)
https://www.haskell.org/

前スレ
関数型プログラミング言語Haskell Part30
http://mevius.2ch.net/test/read.cgi/tech/1484491434/
2018/12/23(日) 00:20:58.06ID:OufBT+Yp
>>875
公称的部分型(ノミナルサブタイピング)
構造的部分型(ストラクチャルサブタイピング)
2018/12/23(日) 00:50:21.75ID:2lSG181k
型推論って、いったい何を目指してるの?
コンパイラは推論できても、人間にとって読みやすいものと思えないんだけど
2018/12/23(日) 02:11:43.05ID:YigQT2JG
template<typename T>って宣言してもどうせ読めないから宣言しないのを目指す
2018/12/23(日) 02:17:29.50ID:zMRMmtKp
>>897
関数型言語だと型を考えることがプログラミングだと言うね
900デフォルトの名無しさん
垢版 |
2018/12/23(日) 16:02:25.42ID:dHWagv9n
Practical Web Development with Haskellってのがまだ70Pくらいしか読んでないけど
認証つきWebアプリをいちから写経しようぜってつくりで初〜中級者にいい感じっぽい
Data.Hasとかこれで初めて知ったわ
2018/12/23(日) 19:07:09.70ID:VkAdoKxx
>>894
気持ち悪いは言い過ぎでした。
あまりハッピーではない、くらいです。

>>895
Integral で意味は分かるでしょ、という事ですね。

探すよりそれが楽で現実的だとは私も思うのですが、
Prelude から取ってくるのは何かこう目的と違うと言うか、
それで妥協するのがちょっと悔しいです。
(Prelude って OOP でクラスを ~Manager とか ~Utility って命名する感がある)

でもアドバイスは有り難いです。
参考にさせてもらいます。
2018/12/23(日) 19:28:31.47ID:14edUGfJ
Preludeなんてものは要らなくて、divはData.integralに入ってて、divを使うには毎回Data.Integralからimportするのが理想って認識で合ってる?
Preludeのその他諸々の関数も含めて
2018/12/23(日) 20:21:12.14ID:YigQT2JG
LinuxにたとえるとデフォルトのGUIなんてものは要らなくて
無数のディストリビューションから選択するのが理想という認識
904895
垢版 |
2018/12/23(日) 20:57:49.01ID:gIQVihKw
>>901
http://hackage.haskell.org/package/base-4.12.0.0/docs/src/Prelude.html
を読んで思いついたんだけど、
import GHC.Real (div)
はどうだい。プレリュードはそのモジュールをre-exportしてる。
2018/12/24(月) 17:05:01.14ID:ovQS6rqM
>>900
Javerが4年で手本になるこなれたコードを書けてるのか疑問なんだがどんな?
2018/12/24(月) 18:43:23.42ID:ovQS6rqM
うわああああこの前Amazon.comから輸入したHaskellの洋書Amazon.co.jpでも売ってたああああ
失敗した
2018/12/24(月) 20:36:56.95ID:OvWyYJqn
当初から比べたらco.jpの洋書の品揃えはずいぶん充実したよね
アカウントを未だ両方持っているけど米版は使わなくなった
908デフォルトの名無しさん
垢版 |
2018/12/25(火) 11:18:00.52ID:yeWprDEr
洋書なら輸入の方が安いって話では
2018/12/25(火) 12:11:51.62ID:3tfaERbL
専門書だと、各地域のamazonで送料込みでも一万円近く違ったりするから
確認はしてる。ごく稀にamazon.co.jpが破格になることもあるけど。
haskell関連だと
Computational Oriented Matroids: Equivalence Classes of Matrices within a Natural Framework
Juergen G. Bokowski
をco.jpで2800円で購入してた。他だと1万円超え。いまもco.jpでセールになって5700円で買えるみたい。
なお、haskellの学習にはなんの役にも立たないので、その分野の数学をやりたい場合だけ買ってね。
2018/12/25(火) 22:13:34.24ID:S7Os6UpT
>>904
ありがとうございます。

実はそれ、存在は知ってました。
実際インポートできる事も試して知ってます。

ただそのモジュール、base パッケージで公開されていません。
https://www.stackage.org/lts-13.0/package/base-4.12.0.0
これを使うのは、Internal 系モジュールを使うよりもっとヤバくないですか?
911デフォルトの名無しさん
垢版 |
2018/12/28(金) 21:37:48.04ID:+Hytqb0t
Haskellerって薬漬けのヤベー奴しかいねーのかよwww
http://fumieval.hatenablog.com/entry/2018/12/27/213853
2018/12/28(金) 21:49:01.05ID:Wkr1Do53
なんか、Haskellなかなか理解進まない

今は、遅延評価あたりをwebで探して読んでるんだけど、
ここら辺のいい日本語の本無いですか?

キーワードは
遅延評価、サンク、ラムダ式、簡約(出来ればグラフ簡約もあれば)当たりが載ってれば
あとは、コンビネータとかもあるとうれしい

情報系の教科書でも、Haskellの教科書でもどちらも大歓迎
2018/12/28(金) 21:53:15.13ID:8AWKvvCO
>>911
エビリファイなんて飴玉ですよ…
私はセレネース(ハロペリドール)とベゲタミンでなんとか生きています…
https://ameblo.jp/kyupin/entry-10102907726.html
「ベゲタミンAおよびBは神の薬で、あれを思いついた人はたぶん天才だと思う。あれは合剤だから神なのであって、あの成分をバラバラに処方すると、なぜかベゲタミンほどは効かない。まぁいずれにせよ絶妙な組み合わせなのだろう。」
2018/12/28(金) 23:38:37.19ID:8YrCKoD/
もともとポエマーな感じだったけどガチやん・・・
2018/12/28(金) 23:49:03.28ID:6JJumxSW
>>912
遅延評価実装の仕組みが知りたいと?
2018/12/29(土) 00:32:49.36ID:lsgoHDjS
>>914
これらより強力な薬はいろいろ見聞きする限りではないようですね…
2018/12/29(土) 02:03:55.74ID:Btke7xay
何が目的で何がわからないかわからないとググって出てきたページ読めくらいしか言えない
2018/12/29(土) 05:40:28.14ID:KKd0HoHx
この人殺人予告まがいのことしてた人じゃん
2018/12/29(土) 08:40:48.37ID:+cssvHV/
>>911
この人、技術的にはなんか凄腕っぽくてフォローしてたけど、こんな人だったんか……(困惑)
2018/12/29(土) 10:05:29.13ID:sjBWTUOw
今朝のテレビの天才特集で
西川徹でてたわ pfiのひと
2018/12/29(土) 11:49:29.33ID:um1nA50l
>>915
うんにゃ 一番知りたいのは レスポンス周り
ちょっと、混乱中なのでうまく書けないんだけど

例えば、サンクってどういうルールで作られるとか どういうルールでつぶされていくのかとか
(単純な四則演算だけど括弧付きがあった場合と 2*2*(3+4)のサンクのの適用法は?最左最外簡約との関係は?)
遅延評価では、必要なところまで評価と書かれているけど、WHNFとそれは一致するのか
(WHNFの中でλ式が出てくるところまでとあるけど、それは式の評価の必要なところなの?)
正直いうと、プリミティブも曖昧なイメージはあるけど、正確には分かっていない。多分組み込み的な型とか演算子、関数だよねw

Webで得られるのは、どうしても断片的な知識になるんで、個々の知識が繋がりづらいのと、
あとはちょっと信頼性が落ちてたりする(初心者には間違いが分かりづらい)
ある程度知識がしっかりしてる人には、内容の真偽を含めそれで十分なのかもしれないけど
2018/12/29(土) 12:04:31.84ID:lsgoHDjS
>>918
「殺人予告」と「殺人予告まがい」とは違うものですよね…
2018/12/29(土) 12:16:13.76ID:UYTJL+lP
>>921
SICP読んだ後、言語ごとの構文解析ちゃんと調べればいいんじゃないかな
924デフォルトの名無しさん
垢版 |
2018/12/29(土) 12:54:03.27ID:EK4sWEwk
>>919
ほんそれ
2018/12/29(土) 13:00:10.35ID:um1nA50l
>言語ごとの構文解析ちゃんと調べればいいんじゃないかな
構文解析という言葉になじみが無いんですが
Haskellの場合具体的に何をすればいいですか?
(情報系の教育は受けてないんで ただ、これからそっち系を漁ろうとはしているけど)


SICPは多分自分の好物w 読みたい候補に入れとく
926デフォルトの名無しさん
垢版 |
2018/12/29(土) 13:48:17.43ID:0jIQbIRd
形式的なのはhaskell language reportってのがあるけど
ボトム(undefinedとか)の扱いが定義されてるだけでサンクの項目は無いね
ボトムの定義としては評価してみないと区別できないってことだから
これを関数に渡してもエラーにしないって感じで評価方法が規定されてる
2018/12/29(土) 14:32:03.91ID:Btke7xay
基本的な知識なしに局所的に理解しようとするからわからないんでしょ
数冊テキスト読んでるうちにたいていの疑問は消える
2018/12/29(土) 14:51:54.06ID:HTMRsjvp
The implementation of functional programming languages
https://www.microsoft.com/en-us/research/wp-content/uploads/1987/01/slpj-book-1987-small.pdf
2018/12/29(土) 16:29:44.50ID:um1nA50l
取りあえず、>>912の質問の回答してくれてありがとう >> 回答者

>>928 それの日本語版頂戴w は冗談として

Haskell本って遅延評価はあんまり書かれていないのかな
サンクとかそれなりに書かれていてもいいと思うけど

とはいえ、もうちょっと具体的な質問が出来るよう出直してきます
930デフォルトの名無しさん
垢版 |
2018/12/29(土) 17:00:23.21ID:e0g6OpD4
実践的なのはこんなの webだけど
スペースリーク、その傾向と対策 - Qiita
https://qiita.com/ruicc/items/bfa659c2ef9e1f75f7e1
2018/12/29(土) 17:36:10.57ID:FOaDygsP
遅延評価は並列処理を学ぶときにちょろっと深くやるくらいな印象
Haskellにおける並列実行 - 純粋関数型魔境 http://amothic.hatenablog.jp/entry/2013/10/09/220004
『Haskellによる並列・並行プログラミング』の中で
この記事の前半部分をもうちょっと詳しく書いてるけど
それでも10ページ未満くらいの分量
2018/12/31(月) 00:40:09.80ID:eNA22sUO
参照カウントを除けばGCのアルゴリズムはみんなメモリ解放を遅延しているという事実
のせいでC++のようなGC無し言語の支持率が異常に高い
2018/12/31(月) 11:19:16.45
GC管轄外領域にROMを作って高速に読み出す機能ができたんですって?
2018/12/31(月) 20:24:52.37ID:/+DS/TZA
>>910
「公開されてないモジュール」というのがあるんだ…
stackageから探せなくて、 GHC.Real のように https://hackage.haskell.org/package/base-4.12.0.0
でリンクなしになってるモジュール。これらは一体どういうものなの? どうやって作る?

外部から使いたいモジュールは、cabal ファイルの exposed-modules セクションに並べる。
テストなどのために外から使いたいが、あまり使って欲しくないものをInternalモジュール配下に。
使用を禁止したいものは exposed-modules から外す。
モジュールの公開はその三択だと思ってた。
935 【吉】 【116円】
垢版 |
2019/01/01(火) 00:46:23.00ID:I2U7Qk8Q
GHC.Realこれ?

https://www.haskell.org/haddock/libraries/index.html

https://www.haskell.org/haddock/libraries/GHC.Real.html
2019/01/01(火) 11:32:28.92ID:9+QtWrOm
それです
937デフォルトの名無しさん
垢版 |
2019/01/01(火) 17:19:58.78ID:7ZW7L+dS
HRR(Haskell relational record)で遊んでるんだけど、
ポスグレのreturning○○に対応したinsert文を生成する機能てないかな?
オートインクリメントある表とかはべたにクエリ書いたほうが楽に感じてしまう
938デフォルトの名無しさん
垢版 |
2019/01/05(土) 19:51:01.28ID:iNZzFN2I
Javaでいえばルール付きインターフェイスがHaskellのモナドという理解でOK?
実装時インターフェイスよりちょっと守るべきルールと性質が多いのがモナド。
型はJavaでいえば複数のインターフェイスを継承できる感じでいいですか?
2019/01/05(土) 20:04:34.05ID:KrQndHog
モナドは単なる自己関手の圏におけるモノイド対象だよ。
2019/01/05(土) 22:45:17.04
モナドは単なる自己関手の圏におけるモノイド対象だよおじさん「モナドは単なる自己関手の圏におけるモノイド対象だよ」
2019/01/06(日) 00:04:04.86ID:13gMXODg
Javaのクラスやインターフェイスは
メソッドの定義を変えられるがメソッドの型は変わらない
例えばObjectクラスのメソッドの定義を変えてもメソッドの型が変わらないので
型チェックが甘い

Haskellのクラスはメソッドの型も変わる
2019/01/06(日) 09:16:44.99ID:7U4qFACZ
>>941
なるほどなあ勉強不足でした。
聞いてみてよかったです。
2019/01/06(日) 20:47:40.51ID:8Nv8H8lo
「where」の日本語読みに関してだけど
「左記の名前(モジュール名/クラス名/インスタンス名/関数名)が
示す物の中では以下の定義が行われています。」
て言う読み方でいいの?

英語の関係福祉 where の「〜する所の」と同じ意味でいいのかどうか。
2019/01/06(日) 21:59:18.26ID:RK31I1jj
右な左。
2019/01/07(月) 06:30:03.04ID:Tzw/TAIJ
>>943
haskell の where は数学の教科書なんかに同じ使い方で普通に出てくる。
というか、haskell が数学から借りてきた。

難しく考えないで、自然に

f = g x where x = ...

f は g x と定義される。
「なお、ここで x は ... である」

みたいに読めばいい。
2019/01/07(月) 14:03:18.35
ん? x の定義は where?となるから先回りして where と書いてる
947デフォルトの名無しさん
垢版 |
2019/01/08(火) 00:20:15.62ID:t9mDJmjK
数学の教科書・・?
948デフォルトの名無しさん
垢版 |
2019/01/08(火) 11:30:51.32ID:GKZx39y6
SQLか
2019/01/08(火) 11:56:51.91ID:ZgpKo6ms
>>947
ごめん、何が ? なのか分からないんだが。
ぼかさず具体的に質問してくれると助かる。

教科書とか参考書とか読み物とかでよく見るよ。
例えば、Haskell に関係ありそうなのだと、
Steve Awodey 著 Category Theory Second Edition の 15~16 ページ目とか。

-----[ 引用 ]-----
The arrow category C-> of a category C has the arrows of C as objects,
and an arrow g from f : A -> B to f' : A' -> B' in C-> is a "commutative square"
(ここに図があり、g1 と g2 が出てくる)
where g1 and g2 are arrows in C.
-----
2019/01/09(水) 03:54:07.58ID:bacokaDQ
フォルダの中身を列挙再帰するのって1回で1階層しか見れなくてIOモナドぶっかけられるから
1関数の中のwhereの中で回すしかない感じですかね?
2019/01/09(水) 06:47:34.41ID:SOqsE/HW
数学の教科書「関数の中・・?・・スコープ・・?」
2019/01/09(水) 16:57:29.61
数学は無限に高速なCPU、無限に使えるメモリを前提として処理を議論する
2019/01/09(水) 19:12:59.65ID:Me/cgKlM
なんだ高卒か
2019/01/09(水) 19:19:36.45ID:vBKfOHsm
時間を考慮に入れないなら高速である必要すらない
955943
垢版 |
2019/01/14(月) 00:22:49.99ID:O/Nk4r6k
>>945 >>944
ありがとうございます。
コード読む時に使わせて頂きます・
2019/01/14(月) 01:01:35.99ID:oPHKHfrN
944は心理か何かか?俺には理解出来んw
2019/01/14(月) 10:58:12.74ID:hZswZX0S
>>950
質問の意味がよく分からないが、
where じゃなくても、自分自身を再帰的に呼べばいいのでは?

directories :: FilePath -> [FilePath]
という型の関数を定義して、その中で、
1. 引数で渡されたパス内のコンテンツを列挙
2. そのうち、ディレクトリであるものを抽出
3. それらに directories 関数を適用
4. 1 と 3 の結果を結合して return

これじゃダメ?
2019/01/14(月) 14:48:46.72ID:hZswZX0S
>>957
シグネチャを間違えた

directiries :: FilePath -> IO [FilePath]
2019/01/14(月) 16:11:26.66ID:tN6VIVTj
-- ほげ :: FilePath -> IO (Bool, [FilePath])
(d, paths) <- ほげ path
if d then foldr (>>) (return ()) $ map 再帰 paths
else ふが
2019/01/15(火) 19:39:53.51ID:bDKJ3jpf
ディープラーニング用ライブラリ grenade を使ってみようと思いましたが、
依存関係のせいで stack でパッケージをインストールできず困っています。

grenade は stackage には無いので stack プロジェクトの stack.yaml ファイルに
必要なパッケージを書き加えました。

extra-deps:
- grenade-0.1.0
- containers-0.5.11.0
- exceptions-0.8.3
- hmatrix-0.18.2.0
- singletons-2.2
- th-desugar-1.6
- template-haskell-2.11.1.0

しかし依存関係が解消されません。
template-haskell が問題を起こしているようです。

exceptions-0.8.3 が template-haskell の >=2.2 && <2.14 を必要とし、
th-desugar-1.6 が同じ template-haskell の <2.12 を必要としています。

よって、template-haskell-2.11.1.0 は両方の条件を満たすと思うのですが、依存関係のエラーが出ます。
しかも、なぜか template-haskell-2.13.0.0 を extra-deps に加えろと推奨されます。

試しに template-haskell-2.13.0.0 を extra-deps に記述してみましたが、
2.11.1.0 の時と全く同じエラーが出ます。
(相変わらず 2.13.0.0 を追加しろと推奨されます)

何が問題なのでしょうか?


stack のバージョンは 1.7.1 です。
2019/01/15(火) 19:48:20.12ID:URfldHzA
ディープラーニングにHaskellを使おうとしていることが問題
2019/01/15(火) 23:33:41.05ID:fNWkI4iJ
>>960
>>=2.2 && <2.14
2019/01/16(水) 00:57:57.45ID:Rf1WUy5G
>>960
stack.yaml で指定している resolver のバージョンはいくつ?

自分は stack が 1.9.3 で resolver: lts-12.26 で試してみたが、
template-haskell-2.13.0.0 from stack configuration does not match...
というエラーが出た。 lts-12.26 が 2.13.0.0 を要求しているためのようだ。
それで resolver を、2.11.1.0 を要求する lts-9.21 に落としてやってみたら依存の解決はできた。
(その後にリンクエラーになってしまったがこれは別の問題だと思う…https://github.com/commercialhaskell/stack/issues/3487 と同じっぽい)
2019/01/16(水) 17:48:25.37ID:f7x8T+kZ
>>962
ごめんなさい、何を指摘されているのか分かりませんでした。

>>963
私は lts-13.3 でやっていました。
指摘通り 9.21 でやってみたところ、問題なくビルドできました。
grenade の githab にある example も動きました。
( 言い忘れていましたが OS は archlimux です)


また、指摘から hackage ではなく githab から grenade のプロジェクトをクローンし、
最新の lts-13.3 でビルドしてみる事を思いつきました。
試したら、こちらも問題なくできました。
想定されてる ghc のバージョンが違うのでそのままではコンパイルエラーが出ますが、
ソースを多少改変したら動きました。

お陰様で作業を進められそうです。
ありがとうございました。
965デフォルトの名無しさん
垢版 |
2019/01/17(木) 21:37:06.39ID:R/7pNsew
cabal new-ナントカ
を日本語で解説してほしい
2019/01/19(土) 10:09:04.13ID:XQ+5XzTr
>>961
> ディープラーニングにHaskellを使おうとしていることが問題

>>960 です。
いや、実用を考えているわけではないです。
haskell 大好きなので、以前 python でやったことを haskell でもできないかと。
ただの遊びです。

ただ、実際 haskell で CartPole が上手くいった画面を見ると感動しました。
物理演算も haskell ライブラリなので python の gym とは違いますが。
(gym-http-api パッケージがなぜか動かないので)

使った主なパッケージは、
学習用
 apecs
 apecs-physics
 grenade
確認用 (アニメーション)
 apecs
 apecs-gloss
 gloss
です。
あとは細々としたものを幾つか。
967sage
垢版 |
2019/01/19(土) 21:02:03.11ID:K21HdJ2L
Haskellの「->」という記号の読み方はありますか?
他のプログラミング言語だと「->」には「アロー演算子」という名前が付けられていますが、Haskellの場合は何という名前なのでしょうか?
2019/01/19(土) 22:34:36.32ID:nurYb0Ef
>>967
型における(->)の英語での読み方は>>839 によると、toもしくはarrow
2019/01/20(日) 14:28:23.05ID:J4e1TPCS
data T = D { f :: Int -> Int }
という型があったら、関数 f の実際の型は T -> Int -> Int だよね。

で、この関数 f の中で、引数として渡されたT 型の値にアクセスする方法って無いかな?

g :: T -> Int -> Int って型の関数を作っても、
D { f = g } なんてできないよね。
h :: Int -> Int なら D { f = h } はできる。
2019/01/20(日) 19:41:43.18ID:xPUxeMcd
data D = D { f :: Int -> Int, x :: Int }
g d y = x d + y
d = D { f = g d, x = 1 }
f d 1 == 2
とか?
2019/01/21(月) 21:42:26.44ID:xU0cTMEl
GHC(Haskell)の上流リポジトリ等がGitLabに移行しました 2019年01月20日
https://qiita.com/takenobu-hs/items/a2eeb327088bb1d2fe77
2019/01/22(火) 18:35:04.27ID:Lbcg1DYs
>>970
なるほど、頭いいな。
採用させてもらうよ。
ありがとう。
2019/01/23(水) 00:07:49.58ID:UhkibQh6
既出かも知れませんが
「 木 (tree) 」の読み方について質問です。

化学では「塩」をシオではなくエンと読む様に
「 木 」もモクやボクと読むのか
訓読みでキと読むのか確認したいです。
2019/01/23(水) 00:12:29.03ID:e48tmJNP
>>973

https://ja.wikipedia.org/wiki/%E6%9C%A8%E6%A7%8B%E9%80%A0_(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0)
https://ja.wikipedia.org/wiki/%E6%9C%A8_(%E6%95%B0%E5%AD%A6)
2019/01/23(水) 00:18:53.14ID:UhkibQh6
>>974
了解です。
薔薇木をバラキと読むのに違和感があったので
確認してみたかったです。
2019/01/23(水) 00:19:35.51ID:Ysgk2cll
その質問は既出じゃないと思う
2019/01/23(水) 00:27:46.89ID:UhkibQh6
そうでしたか。

しかし良く考えてみたら
薔薇木(ばらぼく)って同性愛雑誌みたいでした。
2019/01/23(水) 12:32:21.82ID:8dbvKkbn
薔薇刑 ← 読めない
979デフォルトの名無しさん
垢版 |
2019/01/23(水) 15:57:01.39ID:I7vJASel
葉は
枝えだ
木き
根ね
2019/01/23(水) 16:07:41.36ID:OFN8YGgg
男根おとこね
2019/01/24(木) 00:53:14.43ID:cVpDBcbd
kotlin以下w
kotlinってあれだろ鳥箱の中で争わせて、強いものが… キャー

【IT】習得したいプログラミング言語、したくない言語 プログラミング言語実態調査 2018
https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00501/111200004/
982デフォルトの名無しさん
垢版 |
2019/01/24(木) 10:45:53.06ID:TePOwsZ1
擬人化してくれ
2019/01/24(木) 17:57:50.91
Haskell は初期学習コストが高すぎるのと、圏論イキリおじさんが煙に巻くので近寄りがたい雰囲気を醸している
2019/01/24(木) 18:25:57.35ID:wii/ewut
ちょっと勉強したけど、なんか仕様がコロコロ変わってるような気がして、
本格的に手を出しにくい
2019/01/24(木) 18:27:39.45ID:tqh7mtUe
mtl パッケージの Control.Monad.Reader モジュールで MonadReader クラスが定義されています。

この定義で、なぜ m -> r などという制約が課せられているのでしょうか。

class Monad m => MonadReader r m | m -> r where

この制約がないと何が不都合なのでしょうか。
2019/01/24(木) 23:18:18.45ID:9BqsZZXL
関数従属を消すとコンパイルが通らなくなる例
https://ideone.com/sdajAE

具体的には instance Monad m => MonadReader r (ReaderT r m) の他に
instance Monad m => MonadReader () (ReaderT r m) もあり得るから
MonadReaderに関数従属がないとReaderTの型クラスのようには扱えない
2019/01/25(金) 00:43:33.65
m → r
mを決めると自動的にrも決まるという意味だろうか
いまモナドを、ReaderT r m と決めた
だからそこで使われる r が自動的にMonadReader r 〜の r となるのだ

このように素人目に推測できる
988デフォルトの名無しさん
垢版 |
2019/01/25(金) 08:16:02.28ID:iIPgsGqp
>>983
モナド使うだけなら圏論要らんけどな。
自作するなら圏論要るけど、それはHaskellが難しいんじゃなくて圏論(とか数学)が難しいだけで。
自作しないでただのプログラミング言語として使う分には難しくない。
(どこまで抽象化できるか研究してる人が多いから難しく感じるだけ)

>>=演算子はモナドを受け取ってモナドを返す演算子と覚えておけば良い。
(だからモナド受け取って、モナドの中の値を取り出して処理したらreturnでモナドに包むか、モナド返す関数に引数として渡す)

returnとかclassとか、普通の言語にも同じ用語が出るからって、同じ意味と考えないほうがいい。
まっさらな頭で挑むべし。
(そういう意味で初心者の方が理解が早い)
2019/01/25(金) 18:42:51.74ID:sjWwXpoO
>>986
例は理解できました。
話も、

> 具体的には instance Monad m => MonadReader r (ReaderT r m) の他に
> instance Monad m => MonadReader () (ReaderT r m) もあり得るから

ここまでは理解できたのですが、

> MonadReaderに関数従属がないとReaderTの型クラスのようには扱えない

ごめんなさい、この意味がまだよく分かりません。

MonadReaderに関数従属がないと、
ReaderT型がMonadReaderクラスのインスタンスとして定義できない、
という事でしょうか。
2019/01/25(金) 20:09:29.73ID:RwHnV4/s
C++のtemplateのような制約がないダックタイピングに不都合を実感した者は理解が早い
初心者より早い
2019/01/25(金) 20:13:55.21ID:DHFZGKPe
>>989
型推論において instance Monad m => MonadReader (ReaderT r m) のように扱えると言いたかっただけです
上のコードが意味することを言い換えたつもりだったんですが
言葉としては Monad m => ReaderT r m をMonadReaderのインスタンスのように扱える
とした方が正しかったですね
2019/01/26(土) 19:27:32.21ID:2lj1Pdko
>>991
言葉としては Monad m => ReaderT r m をMonadReaderのインスタンスのように扱える
> とした方が正しかったですね

まだよく分からないです。

これは、関数従属があるからこそ Monad m => ReaderT r m をMonadReaderのインスタンスのように扱える、
ということですよね。

逆に言えば、関数従属がないとそのそうにできない、と。

試しに MonadReader クラスと ReaderT 型を mtl のソースと同じように自作してみました。
(あれは実質 transfirmers の re-export なので、tranformers のソースのように、が正しいですが)

すると、MonadReader クラスの関数従属がなくても、
ReaderT 型を MonadReader クラスのインスタンスにできてしまいました。
エラーなくビルドでき、同じように使うことができました。

どういうことでしょうか。

コンパイラは ghc-8.6.3 です。
2019/01/26(土) 20:36:51.56ID:YCYcr/Gx
>>992
instance Monad m => MonadReader r (ReaderT r m)
この場合インスタンスなのは r と Monad m => ReaderT r m の組み合わせだと理解しているんですが
いずれにしても言いたかったのは前の方の r を無視して扱えるようになるということで
なにか間違ってるようなら忘れてもらって構わないです
2019/01/27(日) 14:38:45.77ID:joZtszNb
UndecidableInstancesだからでは?
自分も理解しきれてないけど
2019/01/27(日) 20:30:51.01ID:wGWJPOk3
質問ではなく否定ができる者は理解が早い
どういうことでしょうか、ではなく、ここが間違っているのを知ってる俺は正しい
その方が圧倒的に早い
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。