関数型プログラミング言語Haskell Part31©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
+が正格で:が正格じゃないということの意味を教えてください。 stack の lts-12.x にはなぜ Yampa パッケージがないんだろ?
11.x の頃はあったのに。 stackでhp2prettyってどうやってインストールするの? >>822
stack install hp2pretty
でいける >>823
ありがと。
ヘルプ見て、stack install == stack build --copy-bins って
カレントディレクトリのプロジェクトをビルドしてできた
実行ファイルをコピーするコマンドだと思いこんでた。 以前の GHC.Stats モジュールには GCStats 型がありましたが、
GHC 8,4,1 からは廃止され、代わりに RTSStats 型および GCDetails 型になったみたいです。
そこで質問です。
以前の currentBytesUsed 関数は今で言うとどの関数に対応、あるいは近いのでしょうか。
gcdetails_live_bytes 関数でしょうか。 f :: a -> b -> c
このコロン以降の部分って、英語圏の人は何て発音してるの?
"a to b to c" で良いの? 不自然かな? 英語圏のコミュニティで日本人なんだけど。。。って質問した方が早いのでは。。。 a arrow b arrow c
call a, b, and c 漫画と同じだろ
台詞は発音するが絵は発音しない
a b c以外は発音しない みんなありがと。
よう分からんから、自分を信じて "a to b to c" って言っておくわ。
>>828
べつに日本語で読まなくてもいいと思うが。
英語でいいんじゃね? それって、そもそも発音する場面なんてあるか?
って意味じゃ・・・
つか、無理にtoで読むとして
f::(a->b)->(a->c)
はどう読むつもりだよ 身近にハスケルの話しできる人なんかいないから発音したこと無いぜ Haskell使って仕事してる人に聞いてみるしかないな c9のhuttonとmeijerのlectureでは、huttonが a to b、meijerが
a arrow bだったと思うけど、別の呼び方しても誰もなんとも思わないよ
モデル上ではcurry化なんて考える必要ないから、数式のまま
f of a and b to c (か、f of a to, b to c)でもいい
(a->b)->(a->c)
は、a arrow b, arrow (or to), a arrow c
,は少しの間 2つの型クラスの間に包含関係を付けるのに
MonadからApplicativeのときみたいに
一方を定義すれば自動的に他方が導出されるようにするのと、
FunctorからApplicativeのときみたいに
一方を定義してからでないと他方を定義できないようにするのと、
どっちのやり方がいいのかな 変数に再代入できる言語に
慣れきっている者の質問なのですが
[1,2,3,4,6,7,8]を順次加算して
[0,1,3,6,10,16,23,31]にする関数を
Githubの作例を参考に実装してみたのですが
直感的に解りづらく、
foldを使ってもっと簡潔・簡単にできないものでしょうか。
ints1 :: [Int]
ints1 = [1,2,3,4,6,7,8]
fn :: Int -> [Int] -> [Int] -> [Int]
fn n [] acum = n : acum
fn n (i : ints) acum = fn (n + i) ints (n : acum)
-- reverse $ fn 0 ints1 [] scanl (+) 0 [1..8] では?
素人なのでわからないけど 842です
foldで書いてみました
fn :: [int] → [int]
fn = foldl (\acc x → acc ++ [last acc+x]) [0]
-- fn [1..8] >>841 >>842
どうもありがとうございます。
驚くほど簡潔に書けるものですね!
今まで気にしなかった (++) の有用性を理解しました。
ありがとうございます。 >>843
どうもありがとうございます。
驚くほど簡潔に書けるものですね!
今まで気にしなかった (++) の有用性を理解しました。
ありがとうございます。 842です
いえいえ、私も初学者なので
scanl はともかく、foldl の方はどうかなと
先輩諸兄のレスを待ってください 何使ってもいいならData.Listのinitsを使って
map sum $ inits [1..8]
が楽チン。 >>840
継承クラスに相当するのがMonad=>Applicativeタイプ
委譲クラスに相当するのがFunctor=>Applicativeタイプ
>>841
The Haskell 98 Report
8 Standard Prelude
https://www.haskell.org/onlinereport/standard-prelude.html
scanl :: (a -> b -> a) -> a -> [b] -> [a]
scanl f q xs = q : (case xs of
[] -> []
x:xs -> scanl f (f q x) xs)
scanr :: (a -> b -> b) -> b -> [a] -> [b]
scanr f q0 [] = [q0]
scanr f q0 (x:xs) = f x q : qs
where qs@(q:_) = scanr f q0 xs 正直全然読みやすくないのだが、本当に読みやすくないのか俺が手続き脳なだけなのか判断がつかない >>849
qのところが(f q x)に替わって再帰してるだけだよ
scanl (+) 0 [1,2,3,4]
= 0 : scanl (+) (0 + 1) [2,3,4]
= 0 : 1 : scaln (+) (1 + 2) [3,4]
= 0 : 1 : 3 : scanl (+) (3 + 3) [4]
= 0 : 1 : 3 : 6 : scanl (+) (6 + 4) []
= 0 : 1 : 3 : 6 : 10 : []
= [0,1,3,6,10] if then elseを最近知った位の超初心者です。
(自分の頭以外に)どこが悪いのかわからないので教えていただきたくて投稿します。
kld1 p q = do -- Kullback-Leibler divergence
-- if length p /= length q
-- then return ()
-- else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
*Main> kld1 [1/2,1/2] [1/4,3/4]
1.4547104198266045
と動作しますが、エラー処理のコメントアウトを外すとコンパイルはできても
kld2 p q = do -- Kullback-Leibler divergence
if length p /= length q
then return ()
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
*Main> kld2 [1/2,1/2] [1/4,3/4]
<interactive>:16:1: error:
? No instance for (Floating (m0 ())) arising from a use of ‘it’
? In a stmt of an interactive GHCi command: print it
と返ってきてエラーメッセージの意味すら理解できません。
if ~ elseの部分はどう直せばいいのでしょうか?
モナドも未学習の超初心者ですので、宜しくお願いします(_ _)。 >>852
型を合わせるにはどう対処すればいいのかわからないのですが、
とりあえず、これで動きました。
kld p q = do -- Kullback-Leibler divergence
if length p /= length q
then error "Not equal length"
else do
let pp = map (/sum(p)) p
qq = map (/sum(q)) q
in sum $ zipWith (\x y -> x * (log x)/(log y)) pp qq
main = do
print $ kld [1,1] [1,3]
print $ kld [1,1] [1,2,3] 関数型プログラミングでログ出力ってどうやってるんですか?
例えば一つの関数で3回ログ出力したいときとか、Writerモナドだと関数内でエラーが起きたときとかうまく出力されてないですよね? Writerでは例外のようなものを投げることができないからもっと万能なモナドを使う
オブジェクト指向にたとえるとObject型
言語にたとえると動的型付け言語のような万能なやつが必要だ 素直に副作用のある言語で組めってことですね
了解です Haskellにも副作用はある
ただ副作用を使えない制約の型が多くて型チェックが厳しいだけ >>855
そんな大それたもの作らないから使った事ないけど、ErrorTとか言うのがControl.Monad.Errorに入ってるっぽい。
何れにしても、本格的な開発するならRWHは持っておいた方が良い。 haslell2010.pdfによくでてくる記号なんだけど”⊥”ってどう意味ですか?
値とか型ぽいんだけど、すごいH本とかの索引にはそんなん無いし。
https://www.haskell.org/definition/haskell2010.pdf 例えば、こんな書き勝たされてるんだけど
P19の一番下に
A conditional expression has the form if e1 then e2 else e3 and returns the value of e2
if the value of e1 is True, e3 if e1 is False, and ⊥ otherwise.
”⊥ otherwise”って何だろう? ええええ 本当に直交って意味なの?
数学なら意味は分かるが(関数解析も入門とか初歩レベルなら読んだ)
プログラミング言語で直交ってどう意味? >>869
Thx ようやくまともな答えが
Haskellやってて面白いのが、新しい概念が増えていくのがうれしい 遅延評価とか >>863
使わない値(_)や、未定義の値や型として使われてるね。
文脈から意味を汲み取るしか無い。 take undefined [] = undefined ― 入力待ち(Carl + Cで強制終了必須)
take 0 undefined = []
⊥をundefined = undefinedと定義してghci で試したとしても、プログラミングHaskellの説明と同じ動きをする。 undef :: b -> a
undef ined = undef ined
これが ⊥ -> a とか () -> a とか () -> ⊥ とかになるせいで
⊥と()を区別する意味がわからなくなる
再帰禁止すれば違いがわかる Haskell では明示的に instance 宣言しなければ、ある class の要件を充たしていることをコンパイラが認識してくれません
Go ではインターフェイスの要件を充たしていれば明示的に宣言しなくても型システムがコンパイル時に暗黙的に推論してくれるそうです(日記帳) bsort [] = []
bsort xs = bsort' [] xs
where bsort' [] [] = []
bsort' xs [y] = y:bsort' [] xs
bsort' xs (x:y:zs) | x <= y = bsort' (y:xs) (x:zs)
bsort' xs (x:y:zs) = bsort' (x:xs) (y:zs)
バブルソートのつもり。。。
バブルと言うより勝ち抜きソートって感じだけど。
アルゴリズム図鑑アプリで動作見ながら、リストは頭からだから交換はコストかかるんでこんな形になった。 動作はこんな感じ。
bsort [3,5,2,4,1]
= bsort' [] [3,5,2,4,1]
= bsort' [5] [3,2,4,1]
= bsort' [3,5] [2,4,1]
= bsort' [4,3,5] [2,1]
= bsort' [2,4,3,5] [1]
= 1:bsort' [] [2,4,3,5]
= 1:bsort [4] [2,3,5]
= 1:bsort' [3,4] [2,5]
= 1:bsort' [5,3,4] [2]
= 1:2:bsort' [] [5,3,4]
= 1:2:bsort' [5] [3,4]
= 1:2:bsort' [4,5] [3]
= 1:2:3:bsort' [] [4,5]
= 1:2:3:bsort' [5] [4]
= 1:2:3:4:bsort [] [5]
= 1:2:3:4:5:bsort' [] []
= 1:2:3:4:5:[]
= [1,2,3,4,5]
最小値が一番最後の唯一つの要素になったらソート済みリストに追加して、
溜め込んだ最小値以外のリストを復帰させて残りのソートを続ける。
(ので、xsとysで見れば浮かび上がる様に見える(?) [a] -> [b]な再帰関数はスタック消費しないよ。 よりスマートに
https://gist.github.com/WhiteCat6142/a3270468cbf829200b7f66acd048b1a2
bsort=foldr bs []
where bs x []=[x]
bs x (y:ys)|x<=y =(x:y:ys)
|otherwise =(y:bs x ys) >>880
Haskellよくわかってないんですが、
y:bsort' [] xs
の部分も末尾再帰でなくともスタック消費しないんですか? 最適化って言うけど最適化無しのddump-asmでもあんまりcallは使われてないんだよね
詳しくは知らないけど再帰と言えど少なくともWHNFで値を返すわけだから
サンクに入った再帰呼び出しを実際に再帰的に呼ぶ必要も無いってことだろう
つまり実際の呼び出しに評価元のスタックが使われるんだとしたら
リストを評価する場合には伸びだ分のスタックがコンスセル毎にクリアされる bsort = unfoldr (uncons . foldr step [])
where step x [] = [x]
step x (y:ys) | x <= y = (x:y:ys)
| otherwise = (y:x:ys) スタックマシンじゃなくてセルオートマトンだったらスタック消費しないよね Prelude.div関数について。
Preludeモジュールをインポートしないで同義の関数を使いたい場合、
どのモジュールをインポートするのが理にかなっているでしょうか。
理にかなっていると言うのは、
import X (div)
という記述を見て「整数の商を求めるのだな」とか、
「数学的な計算の意味での div なんだな」と分かるという意味です。
import Prelude (div)
では意味が分かりません。
(正確には長年Haskell使ってるので意味は分かるが気持ち悪い)
できるだけ役割がハッキリして仕事が限定された小さなモジュールを求めています。
また stackage の中でお願いします。
basement の Basement.Numerical.Multiplicative.div が良い感じですが、
もっと良いものはあるでしょうか。 >>888
(y:bs x ys)は遅延評価だから捜査逆のバブルソート ミ /、`二//-‐''"´::l|::l l! ';!u ';/:::l ', ';::::::l ';:::::i:::::
ニ レ/::/ /:イ:\/l:l l::l u !. l / ';:::l ', ';:::::l. ';::::l:::::
マ レ /:l l:::::lヽ|l l:l し !/ ';:l,、-‐、::::l ';::::l::::
リ /::l l:::::l l\l ヽ-' / ';!-ー 、';::ト、';::::l:::
ス /::::l/l::::lニ‐-、`` / /;;;;;;;;;;;;;ヽ! i::::l:::
ト /i::/ l::l;;;;;ヽ \ i;;;;;;;;;;;;;;;;;;;l l::l:::
/:::l/:l /;;l:!;;;;;;;;;', ';;;;;;;;;;;;;;;;;ノ l:l::
/::::;ィ::l. l;;;;!;;;;;;;;;;;l `‐--‐'´.....:::::::::!l
__|_ ヽヽ /イ//l::l ヽ、;;;;;;;ノ.... し :::::::::::::::::::::ヽ /!リ l
| ー /::::l';!:::::::::::::::::::: u ', i ノ l
| ヽー /イ';::l ’ し u. i l l
| /';:';:!,.イ し 入 l l U
| /,、-'´/ し / ヽ、 u し ,' ,' l
| /l し _,.ノ `フ" ,' ,' ,ィ::/:
| /::::::ヽ ヽ / し ,' ,' / l::
| /::::::::::::`‐、 し ', / u ,、-'´ l,、-
| ``‐-、._::::::::::` ‐ 、 ',/ , -'´`'´ ,-'´
| _,、-‐'"´';:::::::::イ:l';:::` ‐ 、._____,、-‐'"´ u /
| | | | \ l::/ l::::::/リ ';:::::lリ:::::l';:::l l:l:::::l\ u /
| | | | >>891
その「気持ち悪い」の方がよっぽど意味不明なんだから
divの意味が分からないくらい許してやれよ >>891
気持ちわかる。import Data.Integral (div) くらいでやりたいよね。
import Prelude (Integral(div)) はどうかな >>875
公称的部分型(ノミナルサブタイピング)
構造的部分型(ストラクチャルサブタイピング) 型推論って、いったい何を目指してるの?
コンパイラは推論できても、人間にとって読みやすいものと思えないんだけど template<typename T>って宣言してもどうせ読めないから宣言しないのを目指す >>897
関数型言語だと型を考えることがプログラミングだと言うね Practical Web Development with Haskellってのがまだ70Pくらいしか読んでないけど
認証つきWebアプリをいちから写経しようぜってつくりで初〜中級者にいい感じっぽい
Data.Hasとかこれで初めて知ったわ >>894
気持ち悪いは言い過ぎでした。
あまりハッピーではない、くらいです。
>>895
Integral で意味は分かるでしょ、という事ですね。
探すよりそれが楽で現実的だとは私も思うのですが、
Prelude から取ってくるのは何かこう目的と違うと言うか、
それで妥協するのがちょっと悔しいです。
(Prelude って OOP でクラスを ~Manager とか ~Utility って命名する感がある)
でもアドバイスは有り難いです。
参考にさせてもらいます。 Preludeなんてものは要らなくて、divはData.integralに入ってて、divを使うには毎回Data.Integralからimportするのが理想って認識で合ってる?
Preludeのその他諸々の関数も含めて LinuxにたとえるとデフォルトのGUIなんてものは要らなくて
無数のディストリビューションから選択するのが理想という認識 >>900
Javerが4年で手本になるこなれたコードを書けてるのか疑問なんだがどんな? うわああああこの前Amazon.comから輸入したHaskellの洋書Amazon.co.jpでも売ってたああああ
失敗した 当初から比べたらco.jpの洋書の品揃えはずいぶん充実したよね
アカウントを未だ両方持っているけど米版は使わなくなった 専門書だと、各地域の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の学習にはなんの役にも立たないので、その分野の数学をやりたい場合だけ買ってね。 >>904
ありがとうございます。
実はそれ、存在は知ってました。
実際インポートできる事も試して知ってます。
ただそのモジュール、base パッケージで公開されていません。
https://www.stackage.org/lts-13.0/package/base-4.12.0.0
これを使うのは、Internal 系モジュールを使うよりもっとヤバくないですか? なんか、Haskellなかなか理解進まない
今は、遅延評価あたりをwebで探して読んでるんだけど、
ここら辺のいい日本語の本無いですか?
キーワードは
遅延評価、サンク、ラムダ式、簡約(出来ればグラフ簡約もあれば)当たりが載ってれば
あとは、コンビネータとかもあるとうれしい
情報系の教科書でも、Haskellの教科書でもどちらも大歓迎 >>911
エビリファイなんて飴玉ですよ…
私はセレネース(ハロペリドール)とベゲタミンでなんとか生きています…
https://ameblo.jp/kyupin/entry-10102907726.html
「ベゲタミンAおよびBは神の薬で、あれを思いついた人はたぶん天才だと思う。あれは合剤だから神なのであって、あの成分をバラバラに処方すると、なぜかベゲタミンほどは効かない。まぁいずれにせよ絶妙な組み合わせなのだろう。」 >>914
これらより強力な薬はいろいろ見聞きする限りではないようですね… 何が目的で何がわからないかわからないとググって出てきたページ読めくらいしか言えない >>911
この人、技術的にはなんか凄腕っぽくてフォローしてたけど、こんな人だったんか……(困惑) 今朝のテレビの天才特集で
西川徹でてたわ pfiのひと >>915
うんにゃ 一番知りたいのは レスポンス周り
ちょっと、混乱中なのでうまく書けないんだけど
例えば、サンクってどういうルールで作られるとか どういうルールでつぶされていくのかとか
(単純な四則演算だけど括弧付きがあった場合と 2*2*(3+4)のサンクのの適用法は?最左最外簡約との関係は?)
遅延評価では、必要なところまで評価と書かれているけど、WHNFとそれは一致するのか
(WHNFの中でλ式が出てくるところまでとあるけど、それは式の評価の必要なところなの?)
正直いうと、プリミティブも曖昧なイメージはあるけど、正確には分かっていない。多分組み込み的な型とか演算子、関数だよねw
Webで得られるのは、どうしても断片的な知識になるんで、個々の知識が繋がりづらいのと、
あとはちょっと信頼性が落ちてたりする(初心者には間違いが分かりづらい)
ある程度知識がしっかりしてる人には、内容の真偽を含めそれで十分なのかもしれないけど >>918
「殺人予告」と「殺人予告まがい」とは違うものですよね… >>921
SICP読んだ後、言語ごとの構文解析ちゃんと調べればいいんじゃないかな >言語ごとの構文解析ちゃんと調べればいいんじゃないかな
構文解析という言葉になじみが無いんですが
Haskellの場合具体的に何をすればいいですか?
(情報系の教育は受けてないんで ただ、これからそっち系を漁ろうとはしているけど)
SICPは多分自分の好物w 読みたい候補に入れとく 形式的なのはhaskell language reportってのがあるけど
ボトム(undefinedとか)の扱いが定義されてるだけでサンクの項目は無いね
ボトムの定義としては評価してみないと区別できないってことだから
これを関数に渡してもエラーにしないって感じで評価方法が規定されてる 基本的な知識なしに局所的に理解しようとするからわからないんでしょ
数冊テキスト読んでるうちにたいていの疑問は消える 取りあえず、>>912の質問の回答してくれてありがとう >> 回答者
>>928 それの日本語版頂戴w は冗談として
Haskell本って遅延評価はあんまり書かれていないのかな
サンクとかそれなりに書かれていてもいいと思うけど
とはいえ、もうちょっと具体的な質問が出来るよう出直してきます 遅延評価は並列処理を学ぶときにちょろっと深くやるくらいな印象
Haskellにおける並列実行 - 純粋関数型魔境 http://amothic.hatenablog.jp/entry/2013/10/09/220004
『Haskellによる並列・並行プログラミング』の中で
この記事の前半部分をもうちょっと詳しく書いてるけど
それでも10ページ未満くらいの分量 参照カウントを除けばGCのアルゴリズムはみんなメモリ解放を遅延しているという事実
のせいでC++のようなGC無し言語の支持率が異常に高い GC管轄外領域にROMを作って高速に読み出す機能ができたんですって? >>910
「公開されてないモジュール」というのがあるんだ…
stackageから探せなくて、 GHC.Real のように https://hackage.haskell.org/package/base-4.12.0.0
でリンクなしになってるモジュール。これらは一体どういうものなの? どうやって作る?
外部から使いたいモジュールは、cabal ファイルの exposed-modules セクションに並べる。
テストなどのために外から使いたいが、あまり使って欲しくないものをInternalモジュール配下に。
使用を禁止したいものは exposed-modules から外す。
モジュールの公開はその三択だと思ってた。 HRR(Haskell relational record)で遊んでるんだけど、
ポスグレのreturning○○に対応したinsert文を生成する機能てないかな?
オートインクリメントある表とかはべたにクエリ書いたほうが楽に感じてしまう Javaでいえばルール付きインターフェイスがHaskellのモナドという理解でOK?
実装時インターフェイスよりちょっと守るべきルールと性質が多いのがモナド。
型はJavaでいえば複数のインターフェイスを継承できる感じでいいですか? モナドは単なる自己関手の圏におけるモノイド対象だよ。 モナドは単なる自己関手の圏におけるモノイド対象だよおじさん「モナドは単なる自己関手の圏におけるモノイド対象だよ」 Javaのクラスやインターフェイスは
メソッドの定義を変えられるがメソッドの型は変わらない
例えばObjectクラスのメソッドの定義を変えてもメソッドの型が変わらないので
型チェックが甘い
Haskellのクラスはメソッドの型も変わる >>941
なるほどなあ勉強不足でした。
聞いてみてよかったです。 「where」の日本語読みに関してだけど
「左記の名前(モジュール名/クラス名/インスタンス名/関数名)が
示す物の中では以下の定義が行われています。」
て言う読み方でいいの?
英語の関係福祉 where の「〜する所の」と同じ意味でいいのかどうか。 >>943
haskell の where は数学の教科書なんかに同じ使い方で普通に出てくる。
というか、haskell が数学から借りてきた。
難しく考えないで、自然に
f = g x where x = ...
f は g x と定義される。
「なお、ここで x は ... である」
みたいに読めばいい。 ん? x の定義は where?となるから先回りして where と書いてる >>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.
----- フォルダの中身を列挙再帰するのって1回で1階層しか見れなくてIOモナドぶっかけられるから
1関数の中のwhereの中で回すしかない感じですかね? 数学は無限に高速なCPU、無限に使えるメモリを前提として処理を議論する >>945 >>944
ありがとうございます。
コード読む時に使わせて頂きます・ >>950
質問の意味がよく分からないが、
where じゃなくても、自分自身を再帰的に呼べばいいのでは?
directories :: FilePath -> [FilePath]
という型の関数を定義して、その中で、
1. 引数で渡されたパス内のコンテンツを列挙
2. そのうち、ディレクトリであるものを抽出
3. それらに directories 関数を適用
4. 1 と 3 の結果を結合して return
これじゃダメ? >>957
シグネチャを間違えた
directiries :: FilePath -> IO [FilePath] -- ほげ :: FilePath -> IO (Bool, [FilePath])
(d, paths) <- ほげ path
if d then foldr (>>) (return ()) $ map 再帰 paths
else ふが ディープラーニング用ライブラリ 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 です。 ディープラーニングにHaskellを使おうとしていることが問題 >>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 と同じっぽい) >>962
ごめんなさい、何を指摘されているのか分かりませんでした。
>>963
私は lts-13.3 でやっていました。
指摘通り 9.21 でやってみたところ、問題なくビルドできました。
grenade の githab にある example も動きました。
( 言い忘れていましたが OS は archlimux です)
また、指摘から hackage ではなく githab から grenade のプロジェクトをクローンし、
最新の lts-13.3 でビルドしてみる事を思いつきました。
試したら、こちらも問題なくできました。
想定されてる ghc のバージョンが違うのでそのままではコンパイルエラーが出ますが、
ソースを多少改変したら動きました。
お陰様で作業を進められそうです。
ありがとうございました。 cabal new-ナントカ
を日本語で解説してほしい >>961
> ディープラーニングにHaskellを使おうとしていることが問題
>>960 です。
いや、実用を考えているわけではないです。
haskell 大好きなので、以前 python でやったことを haskell でもできないかと。
ただの遊びです。
ただ、実際 haskell で CartPole が上手くいった画面を見ると感動しました。
物理演算も haskell ライブラリなので python の gym とは違いますが。
(gym-http-api パッケージがなぜか動かないので)
使った主なパッケージは、
学習用
apecs
apecs-physics
grenade
確認用 (アニメーション)
apecs
apecs-gloss
gloss
です。
あとは細々としたものを幾つか。 Haskellの「->」という記号の読み方はありますか?
他のプログラミング言語だと「->」には「アロー演算子」という名前が付けられていますが、Haskellの場合は何という名前なのでしょうか? >>967
型における(->)の英語での読み方は>>839 によると、toもしくはarrow 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 } はできる。 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
とか? >>970
なるほど、頭いいな。
採用させてもらうよ。
ありがとう。 既出かも知れませんが
「 木 (tree) 」の読み方について質問です。
化学では「塩」をシオではなくエンと読む様に
「 木 」もモクやボクと読むのか
訓読みでキと読むのか確認したいです。 >>974
了解です。
薔薇木をバラキと読むのに違和感があったので
確認してみたかったです。 そうでしたか。
しかし良く考えてみたら
薔薇木(ばらぼく)って同性愛雑誌みたいでした。 kotlin以下w
kotlinってあれだろ鳥箱の中で争わせて、強いものが… キャー
【IT】習得したいプログラミング言語、したくない言語 プログラミング言語実態調査 2018
https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00501/111200004/ Haskell は初期学習コストが高すぎるのと、圏論イキリおじさんが煙に巻くので近寄りがたい雰囲気を醸している ちょっと勉強したけど、なんか仕様がコロコロ変わってるような気がして、
本格的に手を出しにくい mtl パッケージの Control.Monad.Reader モジュールで MonadReader クラスが定義されています。
この定義で、なぜ m -> r などという制約が課せられているのでしょうか。
class Monad m => MonadReader r m | m -> r where
この制約がないと何が不都合なのでしょうか。 関数従属を消すとコンパイルが通らなくなる例
https://ideone.com/sdajAE
具体的には instance Monad m => MonadReader r (ReaderT r m) の他に
instance Monad m => MonadReader () (ReaderT r m) もあり得るから
MonadReaderに関数従属がないとReaderTの型クラスのようには扱えない m → r
mを決めると自動的にrも決まるという意味だろうか
いまモナドを、ReaderT r m と決めた
だからそこで使われる r が自動的にMonadReader r 〜の r となるのだ
このように素人目に推測できる >>983
モナド使うだけなら圏論要らんけどな。
自作するなら圏論要るけど、それはHaskellが難しいんじゃなくて圏論(とか数学)が難しいだけで。
自作しないでただのプログラミング言語として使う分には難しくない。
(どこまで抽象化できるか研究してる人が多いから難しく感じるだけ)
>>=演算子はモナドを受け取ってモナドを返す演算子と覚えておけば良い。
(だからモナド受け取って、モナドの中の値を取り出して処理したらreturnでモナドに包むか、モナド返す関数に引数として渡す)
returnとかclassとか、普通の言語にも同じ用語が出るからって、同じ意味と考えないほうがいい。
まっさらな頭で挑むべし。
(そういう意味で初心者の方が理解が早い) >>986
例は理解できました。
話も、
> 具体的には instance Monad m => MonadReader r (ReaderT r m) の他に
> instance Monad m => MonadReader () (ReaderT r m) もあり得るから
ここまでは理解できたのですが、
> MonadReaderに関数従属がないとReaderTの型クラスのようには扱えない
ごめんなさい、この意味がまだよく分かりません。
MonadReaderに関数従属がないと、
ReaderT型がMonadReaderクラスのインスタンスとして定義できない、
という事でしょうか。 C++のtemplateのような制約がないダックタイピングに不都合を実感した者は理解が早い
初心者より早い >>989
型推論において instance Monad m => MonadReader (ReaderT r m) のように扱えると言いたかっただけです
上のコードが意味することを言い換えたつもりだったんですが
言葉としては Monad m => ReaderT r m をMonadReaderのインスタンスのように扱える
とした方が正しかったですね >>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 です。 >>992
instance Monad m => MonadReader r (ReaderT r m)
この場合インスタンスなのは r と Monad m => ReaderT r m の組み合わせだと理解しているんですが
いずれにしても言いたかったのは前の方の r を無視して扱えるようになるということで
なにか間違ってるようなら忘れてもらって構わないです UndecidableInstancesだからでは?
自分も理解しきれてないけど 質問ではなく否定ができる者は理解が早い
どういうことでしょうか、ではなく、ここが間違っているのを知ってる俺は正しい
その方が圧倒的に早い すいません。
初心者でこんなこと聞くのもお恥ずかしいんですが、なにをどうググっても情報がでてこないのでお聞きします。
いま話題になってる>>985さんの
class Monad m => MonadReader r m | m -> r where
が全く意味すらわかりません。
“class” が型class を定義する宣言で
“Monad m” が “m は Monad のインスタンスであるときに”
を意味してるんですよね?
そのとき “型 MonadReader r m” が定義されるという風に読めばいいんですよね?
で、その後の
“| m -> r”
がわかりません。
>>985さんは
>この定義で、なぜ m -> r などという制約が課せられているのでしょうか。
と言われてますが、”制約” とはなんですか?
こんな質問して話の腰を折ってはいけないとなんとか自力でググりまくったんですが全くこの記述の意味を理解する情報を発見することはできませんでした。
載っている参考文献でも結構ですのでどなたか教えていただけませんか? >>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 の並び順番に気をつけてください。 このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 488日 10時間 6分 25秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。