関数型プログラミング言語Haskell Part31©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
>>524 >>526
ありがとうございます。
学習の参考にさせて頂きます。 class Hoo a
x :: Hoo a => a -> a
y :: (Hoo a => a) -> a
x = undefined
y = undefined
-- f :: a -> a
-- f a = x a -- コンパイル通らない
g :: a -> a
g a = y a -- コンパイル通る。なんでだ
-- h = y :: a -> a -- 通らない ghcを8.0.2 から 8.2.2に上げた。
h = y :: a -> a -- 通るようになった emacsでSymbols function definition is void: haskell-debug
てエラー文が出ちゃうんですが、原因わかる人いませんか、、
正確にはspacemacsのinteroです、、 tanakhがイキリー田中って呼ばれているみたいだけどイキリーってどういう意味?
550番組の途中ですがアフィサイトへの転載は禁止です (ワンミングク MMda-oDZj)2018/03/11(日) 22:51:59.49ID:2Wu75Uw+M
pezyスパコン社員の
イキリー田中さん曰わく
Hideyuki Tanaka
@tanakh
最近ずっと国会で、国会じゃなくて裁判所でやるようなことばっかりやってないすか。もう逆に裁判所で政策議論した方が三権分立的にいいんじゃないすか(適当)
午前0:06 · 2018年3月10日
https://twitter.com/tanakh/status/972126503352676352 売上データを証拠として提出する発想が裁判所だな
裁判の真似事をやってるのは統計学者だ モナドの中での条件分岐ってはどうやればいいでしょうか
m0 >>= m1 arg1 【 >>= m2 arg2 】 >>= mN argN
【 】のブロックを条件に応じて呼び出すかどうかを制御したいです
whenだと値が取り出せない 遅延評価って面白いね
ぱっと見挙動がわかりにくいのと使い所がみつけづらいのが難点だけど purescriptをめっちゃ強化してクロスコンパイル&ネイティブコンパイル&jsコンパイル&wasmコンパイル可能でさらにビルド速度とGC性能をocaml並に出来ませんか😱 もし自作の型が Generic クラスのインスタンスなら、
その型を Num クラスのインスタンスにするのは容易でボイラープレートを書くだけだ、
という話を聞いたのですが、どういうことでしょうか。 Genericは代数的データ型の代数的構造に対して型クラスを使えるようにする仕組みという感じだから
例えば自然数の型クラスがあったらdata Nat = Zero | Succ Natっぽい型をインスタンスにできる(ようにできる)
data List a = Nil | Cons (List a)とかもList a=Natでいけそうだけど詳しいことは知らない
でNumは整数の型クラスだから符号情報を持たせた自然数っぽい型で考えればいいと思う FRPのBehaviorとEventの構成ってなんか恣意的なのかなって印象で手付かずだったけど、
型がそれぞれ関数と直積で、カリーハワード考えるとForAllとExistsですよて説明見たら、
何に効いてくるのかまだよく分からんけど、真面目にやろうかなと思った。 Yesod のオライリー本ってまだ翻訳されてないの print "日本語"
で日本語を表示するにはどうしたらいいですか? 公開したくない自作データ型を引数に持つ自作関数をhspecでテストする方法を探しています。
自作のモジュールは2つあり、ひとつはテストしたい関数 g がある ModSub、もうひとつは ModSub を使用する ModMain です。
-----[ ModMain.hs ]-----
module ModMain where
import ExtLib (calc) -- 外部ライブラリ
import ModSub
f = calc g 他のいくつかの引数 -- 他にも関数を呼び複雑な計算をする
-----[ ModSub.hs ]-----
module ModSub (g) where
import Control.Applicative
import ExtLib (SomethingClass) -- 外部ライブラリ
data D = D Bool Int
instance SomethingClass D where
someFunc = pure D <*> makeBool 適当 <*> makeInt 適当
g (D b i) = 何か
ExtLib の calc 関数は Something クラスのインスタンス型を引数に持つ関数を取り、その具体的な型は知る必要がありません。
私はアプリケーションの作成に当たって公開しなても動く設計のものは公開しないスタンスです。
なので、ModSub モジュールは D 型のコンストラクタを公開していません。
このような状況ではテストモジュールからも D 型が使えずテストできないため、私は2つの選択肢を考えました。
ひとつは、諦めてスタンスを曲げて D 型のコンストラクタを公開する。
もうひとつは、D 型を別のモジュール InnerModSub 内に定義して公開し、ModSub モジュールとテストモジュールは InnerModSub モジュールを使う。
そして、ModMain モジュールや他のモジュールは決して InnerModSub モジュールを使わないようルールを設ける。
他に何か良い方法はあるでしょうか。 >>554
アドバイスありがとうございます。
その方法でやっても、さらに、そのモジュールを exposed-midules に置くかどうかの選択肢があるのですね。
検討してみます。 ようやくwin10 wslでghcが遅かった件直った感じかな モナまでは可愛いが、油断してるとドがついて怖い感じ。 Reflexやってる人います?Stackと親和的じゃないから結局諦めちゃった。
Threepenny-GUIはシンプルで良いね。Threepennyで作ったのをiOSやAndroidに移植できるんかな。 intellijにhaskellいれようとしてたらいくらやってもだめだったの
よーくみたらWindow Defenderがじゃましてた
はらたつー random パッケージの System.Random モジュールの split 関数は、
新しい RandomGen クラスのインスタンスをなぜ2つも生成するのでしょうか。
2つのインスタンスが要るのなら、引数の1つ目があるのだから、
新たに生成するのも1つで十分だと思うのです。
もっと必要なら、この処理を繰り返せばいいのでは?
私は何か勘違いをしているのでしょうか。 そもそもnextだってgetValとnextGenに分けてもいいけどね
まあ基本的には設計とか効率の問題なんじゃない?
それに戻り値が一つのsplitは引数の方がそのままもう一回splitされないように注意する必要があるし 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
P0GWF エスパー来る
ところで、関数型言語のこの世の春は来ますか? GHCのインストール先の変え方教えて
ちなWindows
Cドライブに入れたくない haskellの練習してる初心者なんですが2進数の文字列表現を10進数の整数に変換する処理ってこんな感じで大丈夫でしょうか? https://csacademy.com/code/CsGalG5X/ 単に数値にしてるだけであって、10進数に変換して表示してるのはprintさんでしょ? Showが忖度したのであってInteger大臣が文字列化を指示したわけではない どうでもいいけど、それぞれのGHC言語拡張の名前で単数形と複数形の違いがいまいち分からん。
うろ覚えで複数形で書いてコンパイルエラーになったり。
命名規則とかあるんかな? 使った中じゃ英語で説明するのに複数形が使われるであろうものなら
大体複数形だったと思うけど
カタカナ語のノリでやってるから割と間違う おい!あの岡部健(毛の壁)がgithubで活動を再開してるぞ! 今時コンパイルとか流行らないよ
サクッと書けても実行までが面倒だと普及しない
もっと標準ライブラリをヘビィにしてPython化するしか生き残りの道はない 同意だ。Turtle使ってシェバンにstackコマンドライン書いて、
Haskellでシェルスクリプトするというのがあったが正気の沙汰とは思えない。 むしろ今はコンパイル全盛期でしょ
rubyとか下火だし どれだけ簡潔に記述出来ても
短いプログラムでは実行するまでの手間の割合が大きくなるから
pythonでいいやってなる 対話環境使わんの?短いプログラムてのがどんな状況か知らんからなんとも。 Haskellで簡潔に書けるという特殊能力を持っておきながら
破壊的で動的型付けな言語を選ばなければいけないという悲劇 なんで宗教みたいに二者択一になるの
要所要所で使い分ければいいだけでしょ たかだか数秒のことで簡潔さを失いたいとは思わないね バンパターンとかseqとか使いまくるからあんま簡潔に書けないわ 簡単なプログラムだと
このifでこれとこれ書き換えてさらにネストしたifでこれとこれを書き換えて
とかやっちゃうな
haskellでもStateモナドとか使えばいいんだろうけど 文字列を直接操作したければ動的型でいい
直接操作することなくShowとReadで処理できるならHaskellの型は無駄ではない 込み入った評価戦略で脳ミソ使わされるのが真理とも思えんがw 文字列入力を要求してその文字列を含むファイルを検索して見つかったらエディタで開く、
的な、コマンドラインからさっと使いたいので実行までが重いと困るけど、
cabalプロジェクトにする程のもんでもない規模のやつ if ってあんま使ったことない。関数のガードとcase、あとData.Bool.bool Haskellは"関数型だから"コードが短く生産性が高いと聞いたのに
関数型ではないPythonの方がコードが短く書けると知った時の絶望感 関数型ではないHaskellがあるってことだろ
男の娘みたいなやつが 関数型こそ邪悪なシンタックスに頼らない無敵の流派なのだ
ただし両方使う方が強い バグバグしてていいならpythonの方が手っ取り早いでしょ そのバグが出ない haskell で、まともなグラフ描けるライブラリ作ってくれよ そういう考え方の人はpythonの方がいいでしょ
住み分け住み分け >>606
hackage にアップされているグラフ描画ライブラリの
まともではない点とその理由を列挙していただけないでしょうか。
来月ちょっと暇ができるので、ここで議論が深まれば、
列挙されたものの幾つかを改善してみようかと思います。 >>608
Haskell は調べかかってあきらめたからよく知らないんだが、Python ユーザの視点で書かせてくれ。
Python だとグラフ描くライブラリは、単純な(と言っても強力な)matplotlib って Matlab のパクリの他、
よりハイレベルなグラフが簡単に描けるライブラリとか、インタラクティブなグラフが描けるライブラリとかがある。
どれも、Jupyter ってWeb環境から普通に使えるし、データフレームって表みたいなデータ構造を入力に出来る。
データフレームはつまらないけど実用的には必須で、
カンマ区切りのテキストファイルとかエクセルとかデータベースを読み取れる。
Haskell ってそもそも標準的なデータフレームが無い気がするんだ。間違ってたらぜひ教えて欲しい。
あとオレが調べた時は単純にHaskell のグラフライブラリは見た目が古臭かった。gnuplot 並み。
最近だとPythonでもRでも、カッコいい色のセットとかを選べるし、複数のグラフを簡単にレイアウトできる。
頑張ればカッコよく描けるのかもしれないけど、そんなところに頑張りたくないんだ。 じゃあグラフ描くならPythonってことでいいんじゃないですかね すいません。ハマってしまってます。助けてください。
GHC 7.8.3です。
有理数係数の複素数の計算をしようとして
import Data.Ratio
import Data.Complex
として
Prelude Data.Ratio Data.Complex> ((0%1):+(1%1))^2
としたら
<interactive>:5:1:
No instance for (RealFloat (Ratio a0)) arising from a use of ‘it’
In a stmt of an interactive GHCi command: print it
と駄目みたいです。
何がだめなのかさっぱりわかりません。
どなたか解決策わかりますか? >>609
matplotlibやpandasあたりは、
そのためだけに、Python使うくらいのライブラリだから、
他の言語に使いたいライブラリがあれば、
その言語を使うで使い分けで良いんじゃない。
Excelの読み書きもなんかもPython使ってるよ。 HaskellのシンタックスのPythonが欲しい >>611
HaskellのComplexで四則演算などをしようとすると
各要素はRealFloatクラスのインスタンス (いわゆる浮動小数点数)である必要がある
Ratio a はRealFloatのインスタンスになれないので計算できない
こうなってる理由はざっくり言えばHaskellのNumが悪い
(参考: https://blog.miz-ar.info/2016/06/haskell-num-class/#abs_signum ) >>614
ありがとうございます。
Ratio a 割り算できるのに駄目なんですね。
別法考えます。 >>609
例えば QuickPlot (https://github.com/sheegl/QuickPlot)
そこそこモダンな描画を行うライブラリでしたが、
README.md にあるとおり、もうメンテナンスは行われていません。
ビジュアライゼーションサーバーのクライアントを作る方がより効率的だから、だそうです。
私もそう思います。
haskell でグラフ描画ライブラリを作るなら、
・データの作成 (取得や加工、整形など)
・サーバーへアクセスするためのインターフェース
この2点の実装に絞りたいですね。
データの作成は、python では Pandas のデータフレームを挙げていますが、
haskell ではこんなのはどうでしょうか。
https://github.com/chrisdone/labels/tree/master/labels-explore
あと、gnuplot を卑下してるようですが、そんなにダメですか?
私には視認性の良いグラフに見えますけど。
Wikipedia のグラフにも使われていますし。 gnuplot も悪いとまでは言わないが、昔の解像度が低く色数もあまりなかった時代に最適化されてる気がするんだよ
Python のグラフと、微妙に用途が違うのかもしれないが
Python のグラフ
ttps://seaborn.pydata.org/examples/index.html >>617
すいません、違いがよくまかりません。
gnuplot デモ
http://gnuplot.info/demos/
私には低解像度&少色数時代の環境に最適化されているようにはどうしても見えないです。 会社のプレゼンに使うならPythonの例の方がオシャレに見える
しかしオシャレなグラフというのは見栄え以外の面では役に立たない Pythonの例として上げられてるのは、seabornという
1. Rからデザインと
2. 人気のあるデータ表示方法
をパクって、同じことをmatplotlib.pyplotを裏で使ってお手軽にできるようにしたパッケージであって、
素のmatplotlib.pyplotのグラフはgnuplotのデフォルトと変わりのない見た目ですよ
gnuplotだって、山ほど表示用オプションがあって綺麗に表示できます >>622
gnuplot でお手軽に綺麗に表示できるようになってるの?
話が逸れたが、ある程度データ構造が共通に使えて
目的に応じて使えるかなり機能も見た目も
良くできたグラフライブラリが幾つかある、ってのが Python の状況だよ
個人的にはHaskell でそれが出来りゃ嬉しいが、、
Python は実行しないとエラーが出ないから、げんなりする時もある
教えてもらった labels- explorer は面白そうなんで見てみるよ >>623
綺麗にできるかどうかは使用者のセンスに依ると思います。
python の方のサンプルは、単に淡い色を使い、
線を太めに表示しているだけに見えますが、違いますか?
他に python のグラフならではの特徴があれば言ってください。
下記のような設計のライブラリがあればあなたの要望は満たされますか?
1. 見た目が python のサンプルの様になる「デザインのプリセット」がある。
2. pandas のデータフレームに似た使い勝手の「2次元の表」からグラフを生成できる。
3. 上記1. 2. を満たせば、グラフの生成自体は gnuplot に任せても良い。 そんなところ頑張りたくないからデフォルトで一般受けする図を出せる奴が欲しいってだけの議論でなんでこんな白熱するんだ >>626
Pythonユーザーの視点、て一言がたぶん余計だったと見受けられる。
Haskellな人、でググると逆の気持ちが分かるかと。 勘違いしているようですが、python 視点とかはどうでもいいです。
要は、希望されている機能がどれだけ楽に実装できるかが問題なんです。
その「頑張りたくないからデフォルトで」がプリセットの提供で満たせ、
かつ gnuplot を使ってもいいのなら、
見た目の部分は頭をそれほど使わず実装できそうです。
また、データフレーム的なデータ構造も、
もうメンテされてなさそうですが、labels-explore で賄えます。
となれば、ライブラリの形はインターフェースを簡易化したラッパー的なもので十分。
一から作るより遙かに楽です。
でも、私の指摘の他に python のグラフならではの特徴があり、
それを求められているのであれば、実装が難しくなり、
正直腰が引けます。
そのための確認です。 普通にいける範囲なら実装してくれるってこと……?
神かよ Pythonならでは、って訳じゃないが(むしろ Rのパクリだと思うが)
facet とかいうグラフを二次元の表に並べたオシャレなグラフは欲しい
軸はグラフ毎に共通にできたりバラバラにできたりする
seaborn の facetgrid ってクラス見てくれ、map でグラフ書いたりしてて、ちょっと関数型言語の影響がありそうだから
あとは逆にHaskell ならではの良さが出るかどうかだな >>630
複数のグラフを並べるのは、gnuplot では、このサンプルの一番下のものですね。
http://gnuplot.sourceforge.net/demo_5.0/layout.html
すみませんが、python 自体は昔に少し触ったくらいで殆ど門外漢です。
不慣れなものを調べるのは面倒で、そこまで労力や時間をかけたくないです。
あくまで、暇ができるのでやってみましょうか、という話です。
なので、実装してほしい事は自分の口で、
python を知らない者にも分かるように説明してください。
それでも、あまりに大変そうならお断りするかも知れませんが。
あと何度も言いますが、オシャレなグラフになるかどうかは個人のセンスですので、
そんなものはライブラリに期待しないでください。
ある程度のプリセットは用意しようと思いますが、あくまで私のセンスです。
普通は利用者がパラメーターを調整して自分でオシャレに仕上げるものです。 それはいけない。
現にSeaborneはおしゃれに仕上げて来ているので、Pythonならライブラリに期待できるのにHaskellでは期待出来ないということになってしまう >>633
プログラミング言語を用いてグラフを作る目的は、
データの取得、加工、整形までをサクッとプログラムしたのだから、
そのデータの全体像を捉えるための可視化も「ついでに」してしまおうというもの。
つまり、プロセッシングしたデータの特徴を「すぐに見たい」という要求に応えるもの。
その様な目的のグラフに求めるのは、データの様相を正しく映すこと。
オシャレなんて入る余地は微塵もありません。
(例えば haskell には使用メモリ量をプロファイルしたデータのグラフ化ツールがありますが、
そのグラフにオシャレさは必要でしょうか)
もし、人にカッコイい思われるグラフを作りたいとか、
人にインパクトを与えるグラフを作りたいという目的ならば、
なにもプログラミング言語を使わなくてもいい。
というのが、古臭いかもしれませんが、私の考えです。
なので、あくまでオシャレなグラフを作るライブラリを求めているのでしたら、
私のモチベーションは大きく下がるので、
この件から降ります。 >>634
そういう考えなら降りた方が良いと思うよ 自己肯定感かな
論理に自信があるなら論理だけでいいがそうでなければオシャレが必要なような気がする 何がオシャレなのかを定義して
正確に人に伝えるところからじゃないの? もし定義できないならできないと伝えるのが正しい言葉なんです ユーザーは最初から見た目を重視してんのに、ここにきていきなりオシャレは必要ないって突っ返すのは、
さすがにPythonがどうとかHaskellがどう以前にコミュニケーション不全 万能なプリセットなんておれは期待してないから、
適当なのを真似るだけで全然問題ないよ
ただ別に金出してるわけでもないから、おれは好き勝手書いてるけど別に従う必要はないよ
あとちょっとグラフに対するおれの感覚と違っているようだから書いておく
少なくとも今は、一種類のデータだけじゃなく、沢山の種類のデータを見たい人がいるんだよ。
そういう人にとっては、情報は圧縮されていて欲しい。忙しいから、全体を見たいんだ。
例えば一台の使用メモリ量じゃなく50台のを見たい、とかだよ。
そんな時に、50枚のグラフを渡されて一個一個が完璧に可視化しているでしょ、とか言われたら困る。
画面に収まるようにするには、削ってもいい情報を削り、例えばfacetみたいな方法でまとめるしかない。
かといって圧縮しすぎても分からなくなるし難しいけどね。 >>641
> 画面に収まるようにするには、削ってもいい情報を削り、例えばfacetみたいな方法でまとめるしかない。
> かといって圧縮しすぎても分からなくなるし難しいけどね。
私は「全体像」を捉えるための可視化と言っています。
細部を見るための可視化とは言っていません。
(50個分のグラフで表されるデータの全体像を捕らえたいという要望に、
50枚のグラフを作るなど愚の骨頂)
そして、それはあなたがオシャレではないと感じている gnuplot でできますよね。
gnuplot のサンプル見ましたか?
gnuplot でもできることは理解したけど、
オシャレではないので却下という事ですか? 長い棒グラフを端折る為に、下端を0以外の数値にしちゃうとか、マナー違反しない限りもう好きにやってくれ オシャレって結局UXだからね
手軽に良いUXが得られる方を使うのは自然っちゃ自然なわけで UXを定義できないなら予測もできない
予測できると思ってるならやっぱり定義するべき UX自体の定義は単純だよね
プロダクトによってユーザーが得る経験
良し悪しになると一意には定まらないけど良い悪いのアンケでも取って統計的有意差を得られれば良い悪いとしていいと思う
もし客観主義として定義可能なものしか定義と認めないと言うならお手上げだ
良いUXが得られるとされるプロセスには既にアンケなどによるユーザ要求の明確化が含まれてしまうからね アンケ取って結果を発表するところまで全部がUXになるからお手上げだな
放○線を測定して数値を報道するみたいなUXだ 出来ない出来ないと言い訳ばかりして実際出来ているPythonから目をそらす プロシュー○「出来る…そんな言葉は使う必要がねーんだ。」 たかがグラフ一つでいつまでもスレを汚さないで
もっと本格的な話をして 質問
let a = takeWhile p $ sort xs
これって、どこまでソート処理されるかは、
xs の並び方と条件 p によるよね
(厳密にはaの評価方法によるけど)
今のsortの実装は確かマージソートだったはずだから、
極端な話、条件に合う要素がただ一つだけ先頭にあれば、
ソート処理はすぐに終わると思っていい? >>651
そういう意図なら
sort $ takeWhile p xs
じゃないかな
最初に書いてある式だと、takeWhile p が引数のリストを評価しようとしたときに
sort xsの第一要素を見る必要があるのでxsをソートし終わらないと評価が進まないはず マージソートでマージが遅延されるならhead $ sort xsはO(n)だと思う
いい感じの説明用コードが思いつかないけど
あとたぶん例のクイックソートも あークイックソートは先頭だけでも最悪O(n^2)になったりするか >>652
オレ >>651
つまりはn要素のリストのsort後の先頭m要素 (m<n) を評価するのは、
n要素を評価するより少ない計算量で済むんじゃないか、という質問なんだ
だから sort と takeWhile を入れ替えたら意味ない ふと思いついたが、比較関数に unsafePerformIO を入れて比較回数をカウントすれば分かるかも
今は実験環境が無いから、起きたら試してみる
お騒がせしてごめん、という結果になるかも
お休み、お前ら 実験したら、やっぱり評価に必要な部分しかソートされなかったよ
実験は takeWhile じゃなく take でやった
[実験コード]
ucomp :: IORef Int -> Int -> Int -> Ordering
ucomp ref x y = unsafePerformIO $ do
modifyIORef ref (+1)
return $ compare x y
main = do
let g = mkStdGen 1
let xs = shuffle' [1..8] 8 g
rc <- newIORef 0
let ys = take 8 $ sortBy (ucomp rc) xs
putStrLn $ show $ maximum ys
c <- readIORef rc
putStrLn $ show c
take で取り出す要素数を8個と3個で実験し、show c の結果を比較
8個 c=19
3個 c=14
やっぱ遅延評価ってイイね
ベスト3を決めるのに他言語みたいに全部を評価する必要がない
ちなみに、100万個の要素でもやってみた
all c=19237801
3個 c=1413225
質問したけど、ひとりで納得してしまった、すまん どんな言語だろうが全部ソートすれば O(n*log(n)) で最小値や最大値を探すのは O(n)
この n と n*log(n) の差を無視できないなら
そもそも n と 100*n の差を無視するのもダメじゃないかと思う >>658
いや、そうじゃなくてさ
上位m個の選択処理とソート処理とをソース上ではきっちり分けてるじゃん
ソースを読む人間にとってはすげー読みやすいわけよ
なのに内部処理的には2つが連携して、
必要なところまでしかソートされないだろ
選択処理のためにワザワザ特殊なソート処理をしなくてもさ
そこがすげーって感動してるんだよ まあソートなんて如何にもキャッシュ次第なアルゴリズムで
連結リストと遅延評価のO(N)が配列と正格評価のO(NlogN)に
現実的なNの範囲で勝てるのかものかどうか・・・ 具体例や比喩で抽象度を下げるのは良い
だが「永久機関っぽいもの」の集合を作ったらむしろ抽象度が上がり収拾がつかなくなる arrayパッケージのData.Array.(!)はO(1)ですか。 yampaムズ過ぎ
初心者用のシンプルで教育的なチュートリアルって無いの?
英語でもいいから教えて >>668
申し訳ない
そこは、FRPの基礎概念である「ビヘイビアとイベント」と、
Yampaの基礎概念である「シグナル関数」との繋がりが言葉で説明されていないんだ
コードを書きまくって慣れろ、って感じ >>669
フーム
ビヘイビアは Time → a でイベントは [ (Time, a) ]
シグナル関数は (Time → a) → (Time → b)
のようなことが 「FRPの話 - maoeのブログ」で少しだけ説明されているね。
もう少し長い解説をElm開発者の人が論文に書いてた。
http://elm-lang.cn/assets/papers/concurrent-frp.pdf >>665 ほらね、Haskell普及のためにはツールの拡充が必要なんだよ。
https://github.com/alanz/vscode-hie-server/pull/83
これこれこういうのを待ってた。emacs対応はよ importのhidingとかqualifiedとか適当にやってるせいで、いつも収拾がつかなくなってる。
ブラックリストかホワイトリストか、asで名前付けるのはどんな時か。みんなどうしてるの? >>673
私も知りたいな。
私の場合は、頻繁に使うもの以外は、
qualified as してる。
そして、asでつける名前にいつも悩む。 インポートリストをざっと見ることで、モジュールの役目が何となく掴めて嬉しい。たとえば
import Data.Text.Lazy
import Text.Parsec
だったら、ああなんかをパーズするんだな、と分かる。
一方、
import Math (sin,cos,tan)
みたいになっていても、このモジュールは三角関数を使うやつ、ということは判るが、それが大して役に立つとは思えない。
だから値の明示的インポートはやめて、hidingだけに統一しようかな、と考えてる。
値がバッティングして、かつ両方使いたいならそのモジュールは qualified する。 >>674
基本大文字を拾って as している。
import qualified Data.Map as M
import qualified Data.Set as S
だが
import qualified Text.Regex.TDFA as TDFA
つらい get programming with haskell 読み終わった。 >>678
凄いハスケルより初心者向きで実用的でわかりやすい。 >>680
実用的というのは?
何かアプリケーションを作るの? >>681
アプリケーションは作らないけれどコマンドラインのプログラムは作る。 新分子設計は並列処理を酷使するだろうが
強化プラスチックが特別どうということはないだろう いいねえ。気軽に使えるからコマンドラインは好き。
自分で使うツールを作るのが一番モチベ上がるね Get Programming with Haskellはタイトルのとおり初心者向けの本だよ
600ページの本で400ページ超えたところでstack導入して、
あとは、簡単なコマンドラインツール、http、JSON、dbおさわりくらい
それまでは、ghci使ってhaskellの学習 Haskell開発ワークフロー。お前らはどれ?
1. stackの--file-watch
2. ghciの:r
3. ghcid
4. エディタのフック
https://www.fpcomplete.com/blog/2018/08/haskell-development-workflows-4-ways 今やすいぞ 多分半額程度
ソフトウェアシステムアーキテクチャ構築の原理 第2版
https://www.amazon.co.jp/ソフトウェアシステムアーキテクチャ構築の原理-第2版-ニック-ロザンスキ-ebook/dp/B00ZF44J0I/ref=tmm_kin_title_0?_encoding=UTF8&qid=1535375513&sr=1-1 カリー化された関数の表記がよく分かりません。
add' :: Int -> (Int -> Int)
add' x y = x + y
↑これはどうやって解釈すればいいのでしょうか?
add' は関数を返す関数であるにもかかわらず、 = x + y となっているので数を返す関数のように見えます。
↓このλ式を使った表記は何の問題もないと思います。
add = \x -> (\y -> x + y) add x = \y -> x + y
これでも問題ないと思います。 Int -> (Int -> Int) も
Int -> Int -> Int も同じやろ
add 1 2 としたらIntになるし
add 1 としたらInt -> Intの関数が得られる
それだけ
更に引数3つとるaddなら
add = \x -> (\y -> (\z -> x + y + z))
と同じ意味だし、haskellはデフォでそういう仕組になってるってことやろ >>694
ありがとうございます。
add' :: Int -> (Int -> Int)
add' x y = x + y
↑この表記って、よくない表記じゃないですか?
add' x y = x + y
↑これをみて、型が add' :: Int -> (Int -> Int) だとはとても分かりません。 逆にそれ見たらどういう型だと思った?
Int -> Int -> Int
って思ったんじゃない?
なんの本読んでるかしらんけど
例えば add x y z なら Int -> Int -> Int -> Int だけど
実際には
Int -> (Int -> (Int -> Int))
こうなってるってことを言いたいんやろ >>696
add' :: Int Int -> Int
という型に見えます。 1 2
のように整数をスペース区切りで二つ並べたものに対して、
1 + 2
を対応させる関数に見えます。 関数を返す関数なんですから、
=
の右には数ではなく関数を書くべきです。 f x = x + 2
などの例を見て、
f ● = ■
という表記は、
f(●) = ■
という意味かと思います。 add は関数を返す関数じゃなくて引数を2つとって値を返す関数やろ
そこでもう勘違いしとる
add 2 3 の結果は関数じゃなくて値やろ?
add 2 のように引数を一個だけ渡したら部分適用されて引数を一個とる関数が返るってだけや
haskellはそういう部分適用できる関数を書きやすいように
add x y = x + y を add = \x -> (\y -> x + y)に自動で変換してくれるってだけ
糖衣構文ってやつ
嫌なら全部ラムダ式で書けばいいよ >>698
じゃああなたが今勉強してるカリー化って何なんですかね? **argv :: char
*argv :: char*
argv :: char**
add' x y :: Int
add' x :: a -> Int
add' :: b -> a -> Int
C言語を学習した人はHaskellも分かる
これが知能だ Haxe では関数の型は、
function sum (a:Int, b:Int) : Int
Int -> Int -> Int
引数1 -> 引数2 -> 戻り値
最後は戻り値 >>701
Haskellは関数適用が最優先だから
add' x y は (add' x) y って意味
だから add' x y = x + y は
「add' にxを適用した結果にyを適用した結果はx+yに等しい」と読める
ちなみに組み込み関数のuncurryを用いて add'' = uncurry add' とでも定義すると
add'' :: (Int, Int) -> Int
というおそらく>>698 でイメージしているであろうものに近い関数が得られる
Haskellのデフォルトの振る舞いはこちらではないという話 通りすがりだけど勉強になった
haskell面白そうだな Haskellちょっといじってると楽しいけどこれで飯食うのは自分には絶対無理という確信がある まずはHaskellの独壇場となるニッチ市場を開拓しないとな
どこかある? 写像をドメイン、コドメインのみ与えて定義するのが簡単にできればちょっと優位にたてる分野はある いまのHaskellには何が足らないのか。どんな分野で強みが活きるのか haskellでddd, cqrs, esのやり方を教えろください DDDが活きてくる(と見込める)ほどの規模の案件をhaskellで組むプロジェクトって凄いな
本格的にhaskellを導入してるんだね >>718
DDD は Extensible Effect と Tagless final がよく合う Haskellに欠けているのは中級者向けの書籍なのかも コンセプトは無茶苦茶面白いのに、肝心の実装が学級的で好き放題に流動的で恐ろしく無責任だからでは ひゃっほおおおう! ビルド通ったぜ
stackageの可能な限り全部の総計2352パッケージを含むプロジェクトのビルドがやっと通った。
もはや ghci をいったん落として stack.yaml と cabal ファイルにパッケージを追記し... などという面倒をしなくても
ただ import するだけでそれが利用可能になる。 spacemacsのinteroでデバッグできてる人います?
replを立ち上げた後、デバッグしようとする(spc m d d)と、
No Haskell session associated with this debug buffer.
てエラーが出て、先に進まないです。
上記はhaskell-debug.elの中に出てくるエラー文で、
上で立ち上げたrepl(stack ghci)がsessionとして認識されてないのが原因?な気がしますが、力及ばずって感じです。 すみません言語の話題から少し外れますが、
Windows10環境で
WinGHCiコンソール(ver 1.0.6)を使っているのですが
表示フォントをコンソラス等にしても
滑らかな文字表示がされず
メモ帳エディタの様な細いジャギー文字表示になります。
何か環境を弄ったり外部設定ファイルを書き換えたりして
外国のユーザー画面みたいな滑らか文字表示にする方法を
もしご存知でしたら教えて下さい。 ポールフダックの音楽/Haskellの本が延期しまくりでつらみ
慰めに手を出してみたreact+reduxが割と面白くてjavascriptおじさんになりそう ハスケルミュージックスクールってやつ
なら無料で読めるドラフトバージョンのやつよんだけど糞つまらんよ
ほとんどがライブラリーの使い方の説明しか書いてない その本です
定価で買うような本じゃなさそうですね… 木構造を表現するときの、「節」とか「葉」って、どう読みますか? 木をきと読むのならふし、は、
木をもくと読むのならせつ、よう
になる 733です
ありがとうございます
「き」「…」「は」で、「節」の読みを決めかねていましたが、>>736さんの仰るとおり、「ふし」で行くことにします すみません、733です
音訓(違うかな?)いずれかに寄せるべきと感じていたからです
他の方々もありがとうございました >>743
グラフ理論だと、文献にもよるけど、道、路、小道、歩道とか出てきて、統一不能感。 メモ化とスペースリークが本質的に同じもので、
言わば発酵と腐敗の関係の様なものだと知ったときは感動した。 >>747
元の英語がpath, trail, walkとか分かれてるのだが
文学なら訳し分けにくい概念は思い切って意訳することもできるが
技術用語だとそうもいかないのが難しいところ Coerce知らなかった。newtypeを自動で剥がしてくれる便利なやつ
import Data.Semigroup
import Control.Arrow
import Data.Coerce
aggregate :: [Int] -> (Maybe Int,Int)
aggregate' :: [Int] -> (Maybe Int,Int)
aggregate = (fmap getMax *** getSum) . foldMap (Just . Max &&& Sum)
aggregate' = coerce . foldMap (Just . Max &&& Sum)
https://speakerdeck.com/konn/ben-dang-hasugoi-newtype リストの要素がすべて異なる場合はTrue、
一つでも同じものがあれば False を返す関数を作りたい。
私が思いつく限りでは、次の方法が効率的には最適解だと思うのだが、どうだろうか。
リストが Eq と Ord のインスタンスであるという制限をかけた上で、
まずリストをソートし、それから隣の要素同士で同値関係を調べる。
ちなみに、これは○○問題などと名前がついているのだろうか。 名前をつけるとしたらグラフ○○かな
グラフ簡約のように木をグラフに変える問題 ソートは不要だし、どの言語でもdictionary/mappingにして要素数見るだけの作業のような >>752
ソートすれば、隣同士の要素の同値関係を調べるだけでよくなるから。
n個の要素を持つ未ソートリストの場合、
リストの第0要素を第1要素と、第2要素と・・・第n要素と比較する。
次にリストの第1要素を第2要素と・・・第n要素と比較する。
とやって、結局 O(n^2) の計算量が必要になる。
ソートするなら O(n log n) で済む。
と思ったけど、オレ勘違いしてるかな。
すまん、修理に出したPCがまだ帰ってこず、
試して速度比較できる環境にないんだ。 >>750
それも結局 O(n log n) だよね?
これが効率的には限界? >>755
アンカー間違えた。
>>753
それも結局 O(n log n) だよね?
これが効率的には限界? 一般的に同値関係とは推移律が成り立ってる関係のことを言うので
全ての要素に対して先頭の要素と同値関係が成り立つのなら任意の要素間で同値関係が成り立つ
ちなみにソートして全探索を早く打ち切らせるテクニックのことは貪欲法という dictionary云々はハッシュ関数で非可逆圧縮してからバケットソートするようなもの
バケットソートはO(n) >>757
なるほど、推移律ね、失念してた。
>>758
バケットソートは分かるが、問題はどうやってハッシュ値を求めるかだよね。
難しそうだが、考えてみる。
みんなありがと。 Arch LinuxのHaskellのリポジトリが
1年間メンテされずに死んでいる状態なのを見ると
Haskellもいよいよ落ち目だなと感じる そういう問題ではなく
向こうでHaskellへの関心が薄れているという事を言いたかった
メンテしていた人もHaskell離れしたかなとか想像できてしまう 本邦では昨年、Qiitaでのアドベントカレンダーは、HaskellがGoについで投稿数が多かった。 入門記事を読んだ人が入門記事を書いての繰り返しですやん。 >>764
数えたがアドベントカレンダーに限ってはそういうのは10個くらいだった。
120程の記事のうちで ネットでは大手のHaskell導入報告が続いて沸いてるとこだがお前らどんだけ情弱だよ Haskell使ってはいけないような低学歴知恵遅れが
Haskellに興味をもってるからな
低学歴知恵遅れがHaskell触ってはいけない
ヤバイことがおきる サイモンペイトンジョーンズがFacebookいってたけどさ、
バック→Haskell
フロント→React
みたいな構成ってそんなメジャーなんやろか FacebookはちょっとしたツールをHaskellで作ってますよ、位だと思ってたが…
>>766
> 大手のHaskell導入報告が続いて沸いてる
気づかなかった。他にはどこが? MonadIO は抽象度が高くて万能すぎ、オーバースペックだよ。
そのせいで、関数の中で何やってるのかシグネチャからは分かりにくいし。
ということで、もっと細かく分けようぜ、という話。
https://chrispenner.ca/posts/monadio-considered-harmful
簡潔で分かりやすい。
こういうのパターンっていうのかな。 githubを見る限りではとても盛り上がっているとは・・・
https://github.com/trending?l=haskell
相変わらず○○をHaskellで書いてみました系のプログラムばかり なんてことないfizzbuzzもHaskellで書くと楽しくなっちゃうんだよな
初めてプログラムを書いたときのwkwkを思い出させてくれる、それがHaskell Haskellでfizzbuzzをやろうとすると「数値か文字を出力する関数ってどうやるんだ?」
みたいなところでつまづきがち >>772
似たようなことはpurescriptではデフォルト(だった?) 結局は書く人本人が気持ちよくなる為の言語だね
パフォーマンスに優れるとかもないし 遅延ストリームを扱うならHaskellは速い方だろう
fizzbuzzの規模じゃそれを採用する利点はわからないけど むしろ最速の言語になってほしい。
「Haskellは参照透明性が保証されているために、最適化にアグレッシブになることができる。
そのため、高いコンポーザビリティによってコードは短くなるにもかかわらず、実行速度はあらゆる高級言語の中で最速である」 「Haskellは参照透明性を保証するために、最適化を犠牲にした。
そのため、高い冗長性によってコードは短くなるにもかかわらず、実行速度はあらゆる高級言語の中で鈍速である」 >>784
returnとpureのこと言ってんの?
returnとpureのこと言ってんのーーーーッ!!? コンパイラフレンドリーに記述したときの速度に概ね不満はないけどコードからパフォーマンスが予測しづらいのがね
そのコードにパフォーマンス上の問題がないか測定してみないとわからない
適切に最適化がかかるかとかスペースリークがないかとか >>787
ベテランになれば実用上問題ない程度には予測できるようになるんじゃね?
俺はまだまだ修行不足だけど 遅延評価だけでなくガベコレの遅さも問題視されるだろう(予測)
ガベコレやめてオブジェクトの寿命を予測できるレベルなら遅延評価も予測できそうだが Haskellはコンパイルさえ通ればバグは滅多にないが通説になっているけど
実際に使うと想定していた100倍くらいメモリを使っていたりと
原因特定が面倒なミスは激減するという程でもないよね。 メモリがないならディスクを使えばいいかもね
ファイルに保存できた方が原因特定も楽だし 評価順序とスペースリークは他の言語にはないバグだから逆に増えてるところもある
しかも発見しづらい
サンクのサイズが一定量に収まるかとかIOの評価順序が正格かとかって静的に解析できそうな気がするができんもんかね データベース的な仕組みだとスペースリークを放置しているやつが多い
某OSのレジストリとか くだらない質問で悪いけど質問させてほしい
Haskellでの優先順位について
・演算子の優先順位の記述はある
・関数適用の優先順位の記述はある
でも、関数の優先順位の記述が見当たらないんだけど(どっかに、左結合ってのはみた)
関数の優先順位はどうなるの?
要するに、かっこ付けの順番なんだけど
1.関数適用
2.演算子
3.関数 <= 最下位の優先順位でいいの? 不確かだけど、F#ではそのような記述があった 希ガス 795だけど、質問がうまくまとまってない希ガス
演算子と関数というのがあるけど、演算子も関数と見なしていいんだよね
ていうことは、
まず、第一の疑問は
1.関数適用の優先順位が高いとして、沢山ある関数(演算子も含む)の中でどの順番で行うのか?
第二の疑問として
3.関数 の優先順位は何?
例えば、compfunc = funcA . funcB (3 + 4)があった場合、最初の関数適用にfuncAと後ろの(.)が
が選ばれない理由でもいいかも a b c d e fの並びは(((((a b) c) d) e) f)
このa,b,c,d,e,fが関数だとか値のバインドだとか関係ない
そういう話ではない? 演算子を関数としてみなすなら
compfunc = funcA . funcB (3 + 4)
は関数として展開して
compfunc = (.) funcA (funcB ((+) 3 4))
で
compfunc = (((.) funcA) (funcB (((+) 3) 4)))
だよね >>797
それを真としすると
自分の理解では、a : funcA b:(.) c: funcB d:(3+4)となるけど、
実際の計算は(((((a b) c) d) e) f)とあってないと思う。
compfunc = funcA . funcB . funcC (3 + 4)の方が分かりやすかったかもしれないけど
関数合成は (funcA . (funcB . funcC)) (3+4)だから (つまり関数合成は右結合)
(((((a b) c) d) e) f)になってないと思う。 (関数というか、カリー化は左結合) >>798
>>799は無視してください。こっちの方が本質だから
うん、その場合なぜ、
funcAより、(.)を関数適用の優先順位を上げたのかが
自分の疑問といってもいいと思う
関数適用の優先順位が高いのはいいとして、
じゃあ、どの関数から関数適用をするの?というのが、私の疑問 >>796
演算子と関数とは似ているように思うかもしれないがちゃんと区別したほうがいい
まず関数適用とは雑に言えば項の間の半角スペースのこと
関数とか定数とか(ただし演算子は除く)をスペースでくっつけるのが関数適用
その関数適用の結合はカッコを除いて最優先なので、特に全ての演算子に優先する
(結合の仕方は>>797の通り)
そして
(.) :: (b -> c) -> (a -> b) -> a -> c
は慣れないうちは紛らわしいが、単に関数を引数に取る2項演算子なので
(演算子として使う限りは)関数適用より優先順位が低い
うーんいまいちちゃんと説明しきれてないし用語の使い方もアヤシイので
誰か詳しい人頼む haskellの構文のBNFを見てみればいいんでない? 質問です。
正確には覚えてないんですが、Haskell の型宣言を省略した場合、コンパイラ、インタプリタがよきにはからってくれてなるべく適用範囲が広い型をつけてくれます。
でもそれは Top-Level ではダメって制約があったと思うんですが、この制約なんか名前ついてたとおもうんですがなんでしたっけ?
これなんの為にあるんでしょう?
これ外すための GHC のオプションがあった記憶もあるんですがわかります?
数年ぶりに Haskell つかったら昔とったハズの杵柄がボロボロに orz。 >>799
compfunc = funcA 1 2 . funcB 4 5 . funcC 5 6 $ funcD 7 8
とあったとき、まず演算子を越えずに関数適用
compfunc = ((funcA 1) 2) . ((funcB 3) 4) . ((funcC 5 ) 6) $ ((funcD 7) 8)
このあとで演算子の優先順位で計算
>自分の理解では、a : funcA b:(.) c: funcB d:( 3+4)となるけど、
a:(.) b:funcA c:(funcB (3 + 4)) だよ
そして a:funcB b: (3 + 4)
そして a:(+) b:3 c :4
演算順序を決める丸括弧は展開出来ないよ 300行近くあるコードなんですが
Haskellの書き方としてイケてない書き方あったら教えてもらえたら嬉しいです
BASIC言語風のインタプリタです
https://csacademy.com/code/4vUVk5c9/ なんとなくわかったというか 暫定でわかった
要するに”関数適用の優先順位は高い”なんだろうね
関数の優先順位の記述が無いのは、そのようなルールが不要だと思えばいいわけで。
かっこ付けのやるべき順序として
1.関数適用 部分適用が出来るなら強欲に
2.演算子の優先順位と結合性でかっこ付け
これで、かっこ付けが終わったので、シグネチャとの整合性を取ってみる。
あっていなければ、コンパイラーエラー
ということで、コンパイラーも理解出来そうなルールになっていそうだし、
>>806とも整合性が取れそうかな BNF見ればちゃんと分かる
https://www.haskell.org/onlinereport/haskell2010/haskellch3.html
単純化するなら
exp = exp1 | exp1 op exp
exp1 = exp2 | exp1 exp2
exp2 = var | (exp)
二項演算子の優先順位を実現するには別の処理が必要だけど
少なくとも関数適用と二項演算子の計算が並ぶことはない >>810
それが、関数適用とどう関係があるのか、俺には理解できない
とうとう俺もBNFを勉強するときが来たようだw
数年に1度、思い出したようにBNFがネックになるんだけどね
今まで避けてきたw >>811
どの言語をやるにしても、ちゃんとした理解には必要になるから頑張れ >>807
イケてるかどうかなんて個人の好き嫌いだよ。
あなたの中に、こういう感じのコードは好きだけど、こういうのは嫌いというのがあって、
その基準に照らして好きなコードになっていたら、それはあなたの中ではイケてるコード、
嫌いなコードになっていたら、あなたの中ではイケてないコードということだ。
そして、好き嫌いの基準は人それぞれ、千差万別なんだよ。
他人の好き嫌いに無理に合わせる必要はない。
それを踏まえた上で、敢えて俺の好き嫌いを言うと、
俺は見通しが良くて、メンテしやすくて、発展させやすいコードが好きだ。
(宣言的ならなお良い)
だから、
・pureな計算とimpureなアクションを別の関数として分けているコードは好き。
分けていないコード大っ嫌い。
・高凝集度で低結合度なコードは好き。
逆は嫌い。
・1つの小さな仕事をさせている関数は好き。
いくつもの仕事をさせて肥えている関数は大嫌い。
・1つの役割だけをしっかり果たしているモジュールは好き。
ごった煮モジュールは大嫌い。
この基準でいくと、あなたのコードはまったくイケてない。 >>813
あざっす!勉強になりやした!精進しやす! >>813
そういうコードの設計センスはどうやって学んだのですか? >>815
大半はHaskell関係なくて、設計論の話 テストどうすんべとか、保守どうしようとか、合成できるようにしたいとか
考えるとええんやで(こなみ) +が正格で:が正格じゃないということの意味を教えてください。 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を超えています。これ以上書き込みはできません。