[過去ログ] 関数型プログラミング言語Haskell Part31©2ch.net (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1: 転載ダメ©2ch.net [ageteoff] 2017/09/27(水)02:33 ID:2XAqPuH2(1/3) AAS
関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
外部リンク:www.haskell.org
前スレ
関数型プログラミング言語Haskell Part30
2chスレ:tech
973(1): 2019/01/23(水)00:07 ID:UhkibQh6(1/3) AAS
既出かも知れませんが
「 木 (tree) 」の読み方について質問です。
化学では「塩」をシオではなくエンと読む様に
「 木 」もモクやボクと読むのか
訓読みでキと読むのか確認したいです。
974(1): 2019/01/23(水)00:12 ID:e48tmJNP(1) AAS
>>973
き
外部リンク:ja.wikipedia.org
外部リンク:ja.wikipedia.org
975: 2019/01/23(水)00:18 ID:UhkibQh6(2/3) AAS
>>974
了解です。
薔薇木をバラキと読むのに違和感があったので
確認してみたかったです。
976: 2019/01/23(水)00:19 ID:Ysgk2cll(1) AAS
その質問は既出じゃないと思う
977: 2019/01/23(水)00:27 ID:UhkibQh6(3/3) AAS
そうでしたか。
しかし良く考えてみたら
薔薇木(ばらぼく)って同性愛雑誌みたいでした。
978: 2019/01/23(水)12:32 ID:8dbvKkbn(1) AAS
薔薇刑 ← 読めない
979: 2019/01/23(水)15:57 ID:I7vJASel(1) AAS
葉は
枝えだ
木き
根ね
980: 2019/01/23(水)16:07 ID:OFN8YGgg(1) AAS
男根おとこね
981: 2019/01/24(木)00:53 ID:cVpDBcbd(1) AAS
kotlin以下w
kotlinってあれだろ鳥箱の中で争わせて、強いものが… キャー
【IT】習得したいプログラミング言語、したくない言語 プログラミング言語実態調査 2018
外部リンク:tech.nikkeibp.co.jp
982: 2019/01/24(木)10:45 ID:TePOwsZ1(1) AAS
擬人化してくれ
983(1): 2019/01/24(木)17:57 AAS
Haskell は初期学習コストが高すぎるのと、圏論イキリおじさんが煙に巻くので近寄りがたい雰囲気を醸している
984: 2019/01/24(木)18:25 ID:wii/ewut(1) AAS
ちょっと勉強したけど、なんか仕様がコロコロ変わってるような気がして、
本格的に手を出しにくい
985(1): 2019/01/24(木)18:27 ID:tqh7mtUe(1) AAS
mtl パッケージの Control.Monad.Reader モジュールで MonadReader クラスが定義されています。
この定義で、なぜ m -> r などという制約が課せられているのでしょうか。
class Monad m => MonadReader r m | m -> r where
この制約がないと何が不都合なのでしょうか。
986(2): 2019/01/24(木)23:18 ID:9BqsZZXL(1) AAS
関数従属を消すとコンパイルが通らなくなる例
外部リンク:ideone.com
具体的には instance Monad m => MonadReader r (ReaderT r m) の他に
instance Monad m => MonadReader () (ReaderT r m) もあり得るから
MonadReaderに関数従属がないとReaderTの型クラスのようには扱えない
987: 2019/01/25(金)00:43 AAS
m → r
mを決めると自動的にrも決まるという意味だろうか
いまモナドを、ReaderT r m と決めた
だからそこで使われる r が自動的にMonadReader r 〜の r となるのだ
このように素人目に推測できる
988: 2019/01/25(金)08:16 ID:iIPgsGqp(1) AAS
>>983
モナド使うだけなら圏論要らんけどな。
自作するなら圏論要るけど、それはHaskellが難しいんじゃなくて圏論(とか数学)が難しいだけで。
自作しないでただのプログラミング言語として使う分には難しくない。
(どこまで抽象化できるか研究してる人が多いから難しく感じるだけ)
>>=演算子はモナドを受け取ってモナドを返す演算子と覚えておけば良い。
(だからモナド受け取って、モナドの中の値を取り出して処理したらreturnでモナドに包むか、モナド返す関数に引数として渡す)
returnとかclassとか、普通の言語にも同じ用語が出るからって、同じ意味と考えないほうがいい。
まっさらな頭で挑むべし。
(そういう意味で初心者の方が理解が早い)
989(1): 2019/01/25(金)18:42 ID:sjWwXpoO(1) AAS
>>986
例は理解できました。
話も、
> 具体的には instance Monad m => MonadReader r (ReaderT r m) の他に
> instance Monad m => MonadReader () (ReaderT r m) もあり得るから
ここまでは理解できたのですが、
> MonadReaderに関数従属がないとReaderTの型クラスのようには扱えない
ごめんなさい、この意味がまだよく分かりません。
MonadReaderに関数従属がないと、
ReaderT型がMonadReaderクラスのインスタンスとして定義できない、
という事でしょうか。
990: 2019/01/25(金)20:09 ID:RwHnV4/s(1) AAS
C++のtemplateのような制約がないダックタイピングに不都合を実感した者は理解が早い
初心者より早い
991(1): 2019/01/25(金)20:13 ID:DHFZGKPe(1) AAS
>>989
型推論において instance Monad m => MonadReader (ReaderT r m) のように扱えると言いたかっただけです
上のコードが意味することを言い換えたつもりだったんですが
言葉としては Monad m => ReaderT r m をMonadReaderのインスタンスのように扱える
とした方が正しかったですね
992(1): 2019/01/26(土)19:27 ID:2lj1Pdko(1) AAS
>>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 です。
993: 2019/01/26(土)20:36 ID:YCYcr/Gx(1) AAS
>>992
instance Monad m => MonadReader r (ReaderT r m)
この場合インスタンスなのは r と Monad m => ReaderT r m の組み合わせだと理解しているんですが
いずれにしても言いたかったのは前の方の r を無視して扱えるようになるということで
なにか間違ってるようなら忘れてもらって構わないです
994: 2019/01/27(日)14:38 ID:joZtszNb(1) AAS
UndecidableInstancesだからでは?
自分も理解しきれてないけど
995: 2019/01/27(日)20:30 ID:wGWJPOk3(1) AAS
質問ではなく否定ができる者は理解が早い
どういうことでしょうか、ではなく、ここが間違っているのを知ってる俺は正しい
その方が圧倒的に早い
996(1): 2019/01/28(月)02:18 ID:UwyAz0OY(1) AAS
すいません。
初心者でこんなこと聞くのもお恥ずかしいんですが、なにをどうググっても情報がでてこないのでお聞きします。
いま話題になってる>>985さんの
class Monad m => MonadReader r m | m -> r where
が全く意味すらわかりません。
“class” が型class を定義する宣言で
“Monad m” が “m は Monad のインスタンスであるときに”
を意味してるんですよね?
そのとき “型 MonadReader r m” が定義されるという風に読めばいいんですよね?
で、その後の
“| m -> r”
がわかりません。
>>985さんは
>この定義で、なぜ m -> r などという制約が課せられているのでしょうか。
と言われてますが、”制約” とはなんですか?
こんな質問して話の腰を折ってはいけないとなんとか自力でググりまくったんですが全くこの記述の意味を理解する情報を発見することはできませんでした。
載っている参考文献でも結構ですのでどなたか教えていただけませんか?
997: 2019/01/28(月)12:06 ID:kUDYAe70(1) AAS
外部リンク[html]:www.kotha.net
外部リンク[html]:downloads.haskell.org
外部リンク:github.com
998: 2019/01/28(月)12:15 ID:LeZdguT6(1) AAS
>>996
私が元の質問者ですが、気にしないで質問なさってください。
>> を意味してるんですよね?
ここまでは良いと思いますが、
>> そのとき “型 MonadReader r m” が定義>> されるという風に読めばいいんですよね?
違います。
定義しているのは型ではなく型クラスです(細かいですが大事なところなので)。
それと | m -> r は、>>986 でもチラッと名前が出てきましたが、日本語では「関数従属」です。
「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 の並び順番に気をつけてください。
999: 2019/01/28(月)12:17 ID:H3y/QtCH(1) AAS
すみません質問いいですか?
1000: 2019/01/28(月)12:39 ID:MTZ0KVk9(1) AAS
いいよ
1001(1): 1001 ID:Thread(1/2) AAS
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 488日 10時間 6分 25秒
1002(1): 1002 ID:Thread(2/2) AAS
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
外部リンク:premium.5ch.net
▼ 浪人ログインはこちら ▼
外部リンク[php]:login.5ch.net
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.234s*