2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

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

関数型プログラミング言語Haskell Part31

1 :デフォルトの名無しさん :2017/09/27(水) 02:33:08.70 ID:2XAqPuH2.net
関数型プログラミング言語 Haskell について語るスレです。

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

前スレ
関数型プログラミング言語Haskell Part30
http://mevius.2ch.net/test/read.cgi/tech/1484491434/

954 :デフォルトの名無しさん:2019/01/09(水) 16:57:29.61 .net
数学は無限に高速なCPU、無限に使えるメモリを前提として処理を議論する

955 :デフォルトの名無しさん:2019/01/09(水) 19:12:59.65 ID:Me/cgKlM.net
なんだ高卒か

956 :デフォルトの名無しさん:2019/01/09(水) 19:19:36.45 ID:vBKfOHsm.net
時間を考慮に入れないなら高速である必要すらない

957 :943:2019/01/14(月) 00:22:49.99 ID:O/Nk4r6k.net
>>947 >>946
ありがとうございます。
コード読む時に使わせて頂きます・

958 :デフォルトの名無しさん:2019/01/14(月) 01:01:35.99 ID:oPHKHfrN.net
944は心理か何かか?俺には理解出来んw

959 :デフォルトの名無しさん:2019/01/14(月) 10:58:12.74 ID:hZswZX0S.net
>>952
質問の意味がよく分からないが、
where じゃなくても、自分自身を再帰的に呼べばいいのでは?

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

これじゃダメ?

960 :デフォルトの名無しさん:2019/01/14(月) 14:48:46.72 ID:hZswZX0S.net
>>959
シグネチャを間違えた

directiries :: FilePath -> IO [FilePath]

961 :デフォルトの名無しさん:2019/01/14(月) 16:11:26.66 ID:tN6VIVTj.net
-- ほげ :: FilePath -> IO (Bool, [FilePath])
(d, paths) <- ほげ path
if d then foldr (>>) (return ()) $ map 再帰 paths
else ふが

962 :デフォルトの名無しさん:2019/01/15(火) 19:39:53.51 ID:bDKJ3jpf.net
ディープラーニング用ライブラリ 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 です。

963 :デフォルトの名無しさん:2019/01/15(火) 19:48:20.12 ID:URfldHzA.net
ディープラーニングにHaskellを使おうとしていることが問題

964 :デフォルトの名無しさん:2019/01/15(火) 23:33:41.05 ID:fNWkI4iJ.net
>>962
>>=2.2 && <2.14

965 :デフォルトの名無しさん:2019/01/16(水) 00:57:57.45 ID:Rf1WUy5G.net
>>962
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 と同じっぽい)

966 :デフォルトの名無しさん:2019/01/16(水) 17:48:25.37 ID:f7x8T+kZ.net
>>964
ごめんなさい、何を指摘されているのか分かりませんでした。

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


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

お陰様で作業を進められそうです。
ありがとうございました。

967 :デフォルトの名無しさん:2019/01/17(木) 21:37:06.39 ID:R/7pNsew.net
cabal new-ナントカ
を日本語で解説してほしい

968 :デフォルトの名無しさん:2019/01/19(土) 10:09:04.13 ID:XQ+5XzTr.net
>>963
> ディープラーニングにHaskellを使おうとしていることが問題

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

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

使った主なパッケージは、
学習用
 apecs
 apecs-physics
 grenade
確認用 (アニメーション)
 apecs
 apecs-gloss
 gloss
です。
あとは細々としたものを幾つか。

969 :sage:2019/01/19(土) 21:02:03.11 ID:K21HdJ2L.net
Haskellの「->」という記号の読み方はありますか?
他のプログラミング言語だと「->」には「アロー演算子」という名前が付けられていますが、Haskellの場合は何という名前なのでしょうか?

970 :デフォルトの名無しさん:2019/01/19(土) 22:34:36.32 ID:nurYb0Ef.net
>>969
型における(->)の英語での読み方は>>841 によると、toもしくはarrow

971 :デフォルトの名無しさん:2019/01/20(日) 14:28:23.05 ID:J4e1TPCS.net
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 } はできる。

972 :デフォルトの名無しさん:2019/01/20(日) 19:41:43.18 ID:xPUxeMcd.net
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
とか?

973 :デフォルトの名無しさん:2019/01/21(月) 21:42:26.44 ID:xU0cTMEl.net
GHC(Haskell)の上流リポジトリ等がGitLabに移行しました 2019年01月20日
https://qiita.com/takenobu-hs/items/a2eeb327088bb1d2fe77

974 :デフォルトの名無しさん:2019/01/22(火) 18:35:04.27 ID:Lbcg1DYs.net
>>972
なるほど、頭いいな。
採用させてもらうよ。
ありがとう。

975 :デフォルトの名無しさん:2019/01/23(水) 00:07:49.58 ID:UhkibQh6.net
既出かも知れませんが
「 木 (tree) 」の読み方について質問です。

化学では「塩」をシオではなくエンと読む様に
「 木 」もモクやボクと読むのか
訓読みでキと読むのか確認したいです。

976 :デフォルトの名無しさん:2019/01/23(水) 00:12:29.03 ID:e48tmJNP.net
>>975

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)

977 :デフォルトの名無しさん:2019/01/23(水) 00:18:53.14 ID:UhkibQh6.net
>>976
了解です。
薔薇木をバラキと読むのに違和感があったので
確認してみたかったです。

978 :デフォルトの名無しさん:2019/01/23(水) 00:19:35.51 ID:Ysgk2cll.net
その質問は既出じゃないと思う

979 :デフォルトの名無しさん:2019/01/23(水) 00:27:46.89 ID:UhkibQh6.net
そうでしたか。

しかし良く考えてみたら
薔薇木(ばらぼく)って同性愛雑誌みたいでした。

980 :デフォルトの名無しさん:2019/01/23(水) 12:32:21.82 ID:8dbvKkbn.net
薔薇刑 ← 読めない

981 :デフォルトの名無しさん:2019/01/23(水) 15:57:01.39 ID:I7vJASel.net
葉は
枝えだ
木き
根ね

982 :デフォルトの名無しさん:2019/01/23(水) 16:07:41.36 ID:OFN8YGgg.net
男根おとこね

983 :デフォルトの名無しさん:2019/01/24(木) 00:53:14.43 ID:cVpDBcbd.net
kotlin以下w
kotlinってあれだろ鳥箱の中で争わせて、強いものが… キャー

【IT】習得したいプログラミング言語、したくない言語 プログラミング言語実態調査 2018
https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00501/111200004/

984 :デフォルトの名無しさん:2019/01/24(木) 10:45:53.06 ID:TePOwsZ1.net
擬人化してくれ

985 :デフォルトの名無しさん:2019/01/24(木) 17:57:50.91 .net
Haskell は初期学習コストが高すぎるのと、圏論イキリおじさんが煙に巻くので近寄りがたい雰囲気を醸している

986 :デフォルトの名無しさん:2019/01/24(木) 18:25:57.35 ID:wii/ewut.net
ちょっと勉強したけど、なんか仕様がコロコロ変わってるような気がして、
本格的に手を出しにくい

987 :デフォルトの名無しさん:2019/01/24(木) 18:27:39.45 ID:tqh7mtUe.net
mtl パッケージの Control.Monad.Reader モジュールで MonadReader クラスが定義されています。

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

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

この制約がないと何が不都合なのでしょうか。

988 :デフォルトの名無しさん:2019/01/24(木) 23:18:18.45 ID:9BqsZZXL.net
関数従属を消すとコンパイルが通らなくなる例
https://ideone.com/sdajAE

具体的には instance Monad m => MonadReader r (ReaderT r m) の他に
instance Monad m => MonadReader () (ReaderT r m) もあり得るから
MonadReaderに関数従属がないとReaderTの型クラスのようには扱えない

989 :デフォルトの名無しさん:2019/01/25(金) 00:43:33.65 .net
m → r
mを決めると自動的にrも決まるという意味だろうか
いまモナドを、ReaderT r m と決めた
だからそこで使われる r が自動的にMonadReader r 〜の r となるのだ

このように素人目に推測できる

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

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

returnとかclassとか、普通の言語にも同じ用語が出るからって、同じ意味と考えないほうがいい。
まっさらな頭で挑むべし。
(そういう意味で初心者の方が理解が早い)

991 :デフォルトの名無しさん:2019/01/25(金) 18:42:51.74 ID:sjWwXpoO.net
>>988
例は理解できました。
話も、

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

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

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

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

MonadReaderに関数従属がないと、
ReaderT型がMonadReaderクラスのインスタンスとして定義できない、
という事でしょうか。

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

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

994 :デフォルトの名無しさん:2019/01/26(土) 19:27:32.21 ID: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 です。

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

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

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

998 :デフォルトの名無しさん:2019/01/28(月) 02:18:47.10 ID: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 などという制約が課せられているのでしょうか。

と言われてますが、”制約” とはなんですか?
こんな質問して話の腰を折ってはいけないとなんとか自力でググりまくったんですが全くこの記述の意味を理解する情報を発見することはできませんでした。
載っている参考文献でも結構ですのでどなたか教えていただけませんか?

999 :デフォルトの名無しさん:2019/01/28(月) 12:06:40.91 ID:kUDYAe70.net
http://www.kotha.net/ghcguide_ja/latest/type-class-extensions.html#functional-dependencies
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#functional-dependencies
https://github.com/shiatsumat/wiwinwlh-jp/wiki/%E5%9E%8B%E6%97%8F

1000 :デフォルトの名無しさん:2019/01/28(月) 12:15:36.89 ID: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 の並び順番に気をつけてください。

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

1002 :デフォルトの名無しさん:2019/01/28(月) 12:39:33.26 ID:MTZ0KVk9.net
いいよ

1003 :2ch.net投稿限界:Over 1000 Thread
2ch.netからのレス数が1000に到達しました。

総レス数 1003
264 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★