関数型プログラミング言語Haskell Part31at TECH
関数型プログラミング言語Haskell Part31 - 暇つぶし2ch1004:デフォルトの名無しさん
19/01/24 18:25:57.35 wii/ewut.net
ちょっと勉強したけど、なんか仕様がコロコロ変わってるような気がして、
本格的に手を出しにくい

1005:デフォルトの名無しさん
19/01/24 18:27:39.45 tqh7mtUe.net
mtl パッケージの Control.Monad.Reader モジュールで MonadReader クラスが定義されています。
この定義で、なぜ m -> r などという制約が課せられているのでしょうか。
class Monad m => MonadReader r m | m -> r where
この制約がないと何が不都合なのでしょうか。

1006:デフォルトの名無しさん
19/01/24 23:18:18.45 9BqsZZXL.net
関数従属を消すとコンパイルが通らなくなる例
URLリンク(ideone.com)
具体的には instance Monad m => MonadReader r (ReaderT r m) の他に
instance Monad m => MonadReader () (ReaderT r m) もあり得るから
MonadReaderに関数従属がないとReaderTの型クラスのようには扱えない

1007:デフォルトの名無しさん
19/01/25 00:43:33.65 .net
m → r
mを決めると自動的にrも決まるという意味だろうか
いまモナドを、ReaderT r m と決め�


1008:ス だからそこで使われる r が自動的にMonadReader r ~の r となるのだ このように素人目に推測できる



1009:デフォルトの名無しさん
19/01/25 08:16:02.28 iIPgsGqp.net
>>985
モナド使うだけなら圏論要らんけどな。
自作するなら圏論要るけど、それはHaskellが難しいんじゃなくて圏論(とか数学)が難しいだけで。
自作しないでただのプログラミング言語として使う分には難しくない。
(どこまで抽象化できるか研究してる人が多いから難しく感じるだけ)
>>=演算子はモナドを受け取ってモナドを返す演算子と覚えておけば良い。
(だからモナド受け取って、モナドの中の値を取り出して処理したらreturnでモナドに包むか、モナド返す関数に引数として渡す)
returnとかclassとか、普通の言語にも同じ用語が出るからって、同じ意味と考えないほうがいい。
まっさらな頭で挑むべし。
(そういう意味で初心者の方が理解が早い)

1010:デフォルトの名無しさん
19/01/25 18:42:51.74 sjWwXpoO.net
>>988
例は理解できました。
話も、
> 具体的には instance Monad m => MonadReader r (ReaderT r m) の他に
> instance Monad m => MonadReader () (ReaderT r m) もあり得るから
ここまでは理解できたのですが、
> MonadReaderに関数従属がないとReaderTの型クラスのようには扱えない
ごめんなさい、この意味がまだよく分かりません。
MonadReaderに関数従属がないと、
ReaderT型がMonadReaderクラスのインスタンスとして定義できない、
という事でしょうか。

1011:デフォルトの名無しさん
19/01/25 20:09:29.73 RwHnV4/s.net
C++のtemplateのような制約がないダックタイピングに不都合を実感した者は理解が早い
初心者より早い

1012:デフォルトの名無しさん
19/01/25 20:13:55.21 DHFZGKPe.net
>>991
型推論において instance Monad m => MonadReader (ReaderT r m) のように扱えると言いたかっただけです
上のコードが意味することを言い換えたつもりだったんですが
言葉としては Monad m => ReaderT r m をMonadReaderのインスタンスのように扱える
とした方が正しかったですね

1013:デフォルトの名無しさん
19/01/26 19:27:32.21 2lj1Pdko.net
>>993
言葉としては 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 です。

1014:デフォルトの名無しさん
19/01/26 20:36:51.56 YCYcr/Gx.net
>>994
instance Monad m => MonadReader r (ReaderT r m)
この場合インスタンスなのは r と Monad m => ReaderT r m の組み合わせだと理解しているんですが
いずれにしても言いたかったのは前の方の r を無視して扱えるようになるということで
なにか間違ってるようなら忘れてもらって構わないです

1015:デフォルトの名無しさん
19/01/27 14:38:45.77 joZtszNb.net
UndecidableInstancesだからでは?
自分も理解しきれてないけど

1016:デフォルトの名無しさん
19/01/27 20:30:51.01 wGWJPOk3.net
質問ではなく否定ができる者は理解が早い
どういうことでしょうか、ではなく、ここが間違っているのを知ってる俺は正しい
その方が圧倒的に早い

1017:デフォルトの名無しさん
19/01/28 02:18:47.10 UwyAz0OY.net
すいません。
初心者でこんなこと聞くのもお恥ずかしいんですが、なにをどうググっても情報がでてこないのでお聞きします。
いま話題になってる>>987さんの
class Monad m => MonadReader r m | m -> r where
が全く意味すらわかりません。
“class” が型class を定義する宣言で
“Monad m” が “m は Monad のインスタンスであるときに”
を意味してるんですよね?
そのとき “型 MonadReader r m” が定義されるという風に読めばいいんですよね?
で、その後の
“| m -> r”
がわかりません。
>>987さんは
>この定義で、なぜ m -> r などという制約が課せられているのでしょうか。
と言われてますが、”制約” とはなんですか?
こんな質問して話の腰を折ってはいけないとなんとか自力でググりまくったんですが全くこの記述


1018:の意味を理解する情報を発見することはできませんでした。 載っている参考文献でも結構ですのでどなたか教えていただけませんか?



1019:デフォルトの名無しさん
19/01/28 12:06:40.91 kUDYAe70.net
URLリンク(www.kotha.net)
URLリンク(downloads.haskell.org)
URLリンク(github.com)

1020:デフォルトの名無しさん
19/01/28 12:15:36.89 LeZdguT6.net
>>998
私が元の質問者ですが、気にしないで質問なさってください。
>> を意味してるんですよね?
ここまでは良いと思いますが、
>> そのとき “型 MonadReader r m” が定義>> されるという風に読めばいいんですよね?
違います。
定義しているのは型ではなく型クラスです(細かいですが大事なところなので)。
それと | m -> r は、>>988 でもチラッと名前が出てきましたが、日本語では「関数従属」です。
「haskell 関数従属」でググるとでてきます。
簡単に言えば、| m -> r はこのクラスのインスタンス型において、
型変数 m の型が具体的に決まれば、型変数 r の具体的な型が「一意に」推論できなければならない、
という制約です。
例えば class TTT a b | a -> b という宣言があると、
TTT Int String というインスタンス型と TTT Int Double というインスタンス型は「同時には」存在できません。
a の型が Int なのに、b の型が String の場合のインスタンス型も Double の場合のインスタンス型も定義されているからです。
逆に、TTT String Int と TTT Double Int はOKです。
関数従属になんら違反していません。
| x -> y の x と y の並び順番に気をつけてください。

1021:デフォルトの名無しさん
19/01/28 12:17:56.53 H3y/QtCH.net
すみません質問いいですか?

1022:デフォルトの名無しさん
19/01/28 12:39:33.26 MTZ0KVk9.net
いいよ

1023:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 488日 10時間 6分 25秒

1024:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch