◎正当な理由による書き込みの削除について: 生島英之とみられる方へ:
関数型プログラミング言語Haskell Part31©2ch.net ->画像>6枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1506447188/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
https://www.haskell.org/ 前スレ
関数型プログラミング言語Haskell Part30
http://mevius.2ch.net/test/read.cgi/tech/1484491434/ 質問させてください
Stringの配列xsを1つの要素につき1行ずつ画面に出力する場合、
mapM_ putStrLn xs
と
putStr.unlines $ xs
ならどちらの方がいいのでしょうか?
https://ideone.com/hreKZz 前スレの分割集合のアルゴリズムをdp風にしてみたけど
結局リストを作るコストは同じだからむしろ遅くなったわ
Haskell 入門書の新刊が、今日付で発売。
『Haskell入門 関数型プログラミング言語の基礎と実践』技術評論社、¥3,280(税別)
http://gihyo.jp/book/2017/978-4-7741-9237-6 (一部ページのサンプルpdfあり)
https://www.amazon.co.jp/dp/4774192376 日本人の書くHaskell本は入門書ばっか。
ダメとは言わんが、バラエティーがないね。
だって関数プログラミングについて深い内容を書けるだけの知識と見識のある人間なんて日本にはいない
実務家も大学の先生もね
誰か、競プロを生き抜くためのHaskell TipsをKindle出版してくれ
できればUnlimited 対応で
>>10 haskell-masterことtanakh大先生に頼むしかないな
Glorious haskell-master tanakh is crazy about Rust these days.
>>11 何を以て中級と言えるか分からんが、
実用的なアプリを作るのに欠かせない技術や考え方を学ぶという観点なら
http://www.apress.com/us/book/9781430262503 を勧める。
タイムマシンを販売するWebストアを作るという体で解説が進む。
(なぜタイムマシンなのかは最後に分かる)
名前に Beginning とあるが、Beginning なのは第1部だけで、
第2部以降は実戦色が強くなる。
この本の大きな特徴は、第2部以降は必要性が出てきた段階で、
必要な分だけ Haskell の構文やライブラリや技術などの解説がされることが多いこと。
たとえばアプリのリソースの扱い方を学ぶ段階で初めて
IOモナドによる入出力の解説が登場するのは当たり前だが、
それと同じ章で Conduit や Binary Serialization の解説が登場する。
実用的なアプリの作成において、これらでリソースを扱うのが非常に有用だからだ。
入門書では前半で出てくるような型がこの本では後半で出ることもある。
入門書をしっかり理解できているのなら適当に読み飛ばしたくなる所もあると思うが、
そこで作った型や関数は後で使うことが多いので、復習と思ってぐっと我慢すべし。
個人的には、アーキテクチャレベルの章が無いのが残念。
新しくでたHaskell本、田舎に住んでる自分的にはいい感じだわ。
著者の方をみると、東京とかの勉強会はこの辺を踏まえてるんだなと勝手に思ってる。
周りにHaskellerがおらず独りでやってるけど、実践的な面で何か取りこぼしがないかとの疑問が頭に残ってたから、これで安心。
例えば、undefinedをAgdaのホールみたいに使えるとか知らんかった。
実際何か作ろうとなったときに今どのライブラリでどう作ればいいかの道筋を示す本はないから
そこをわかって出してくれてそうな今回の入門書に期待
>>19 ないね。
理論的な部分はこれまでの良書で固めて、
上で書いたような、俗っぽい(悪い意味ではない)部分を補充、といった感じかと。
ところで、今Webアプリってブームなの?
みんなWebアプリを作りたくてウズウズしてんの?
ゲーム作るならFRPなの?
どのパッケージがいいの? ヘルムって奴?
それ以前にFRPってどこで勉強すればいいの?
Elm、FRPやめたってよ
FRPと関数型のことは忘れろ
えええ。。。じゃあHaskellでゲームって、なんのライブラリ使って作るの
自分で作ってみるのはどうでしょうか?
良いライブラリができたら公開してね!!
HaskellによるゲームプログラミングにFRPを使うメリットがない。
みんなhaskellで何するの?
haskellのためのhaskellしてるみたいなイメージ
stackがあればハスケルコンパイラーインストール必要ないんやな。
全部消してやったぜ。
神様ありがとう、ハスケルに会わせてくれて
君は眠っていたね
>>32 C言語の倒し方を発見する
またはC言語を倒せないことを証明する
>>32 あえて言おう
自分自身の処理系を記述できない処理系はクソ
Eq クラスや Show クラスのように default deriving として使えるクラスを自作することはできますか?
Haskellによる関数プログラミングの思考法
Richard Bird (著), 山下伸夫 (翻訳)
https://www.amazon.co.jp/dp/4048930532/ この本ていいの?
すぐ教えろ
C++ Rust Haskellは言語とライブラリを見るだけで楽しめるが
言語とライブラリはすぐ古くなるのがこわくて手を出せないやつが多いんだろうね
>>39 ありがとうございます。
その本を借りてみます。
>>40 「関数プログラミング 珠玉のアルゴリズムデザイン」のための良い入門書って感じ
REPLでlet文ごっそり複数行貼れるんだね。
ちまちま一行ずつコピペしててバカみたいだったww
自分みたいなアホはあまりいないと思うけど、一応の注意喚起。
Data.MapのfromListとtoListはキーが例えば自然数なら自動で昇順になるのですか?
確実を期すのであればfromAscListやtoAscListを使うべきですか?
Functional Pearl って何? 自分で名乗ってもいいの?
vectorパッケージでリスト内包表記的なのってありますかね?
また、ああいうsyntax sugarてユーザーが定義できるんでしょうか?
bindの連結がよくわかってないので質問させてください
Just 10 >>= \x -> return (x + 1) >>= \y -> return (x + y + 2)
と書いた場合、明示的に括弧でくくるとしたら
Just 10 >>= \x -> (return (x + 1) >>= \y -> return (x + y + 2))
になりますよね?これが
Just 10 >>= \x -> return (x + 1) >>= \y -> return (y + 2)
の場合でも
Just 10 >>= \x -> (return (x + 1) >>= \y -> return (y + 2))
になるのですか?それとも
(Just 10 >>= \x -> return (x + 1)) >>= \y -> return (y + 2)
やあるいは別の場所がくくられますか?
下の場合どこでくくっても答えが同じなので混乱してきました
Just 10 >>= (\x -> return (x + 1) >>= (\y -> return (x + y + 2))
do
x <- Just 10
y <- return (x + 1)
return (x + y + 2)
Just 23
カッコで括らない限りラムダ式のリテラルを使うとそれ以降はラムダ式の内側になるから
bindというか演算子に限らずa+\x->x+bみたいなのはa+(\x->x+b)
>>63 let と where を同時に使わない、さえ守ればまあ。
https://wiki.haskell.org/Let_vs._Where ちなみにcaseを使わないでパターンガードで書くと
ガードをまたげる where の方が書きやすいので
個人的にはまさにcaseもletも使わない
使う意味がわからない
局所的なスコープの中だから式でないと書けないでもなければ使わない
値ならlet、関数ならwhereみたいな使い分けしてるわ
両方混ざることもしばしば
caseもdo構文の中とかで普通に使わね?
左上から順番に読んで引っかかる時はlet使うかな。パターンガードはwhere一択だね。
baseパッケージを雑に調べたんだけど、総数はそれぞれ
where: 2038
let: 665
case: 979
foo = \ n -> let xs = map fib [0 ..] in xs !! n
bar = let xs = map fib [0 ..] in \ n -> xs !! n
宗教はいくつか掛け持ちする方がいい
nonlocalにすればlifetimeが長いとか便利な言葉が使える
宗教で思い出したんだけど、みんなエディタは何使ってる?
https://github.com/rainbyte/haskell-ide-chart Atom派が増えてきた気がする(Stepwise Debuggerってなんだろう)。
vimのlanguage server対応がもっと進んだらvimに戻りたい
HIE知らんかった。試してみよう。
自分もSpacemacsだわ。
プログラミングに限らず、およそ文字列を編集する作業において、
vim以外のエディタは考えられない体になってしまった。
タイプミスが多いのでキー入力コマンド操作とか誤操作ばかりで死ぬ
CoqとかAgdaもやろうとしてたからEmacs一択で、
Vimの操作性も習得したいと思ってたから結果的にSpacemacsに落ち着いたわ。
Spacemacs知れようとして、Emacsのバージョン足りなくて死んだ
静的どころか参照透明なんだし、補完は充実してほしいよなあ。
data Pen = Pineapple | Apple
apple = Apple
pen :: Pen
pen = a
もうこの時点で候補をappleに絞ってほしい。
そんな「絞り込み」はそもそもできないしすべきでもない
そもそもその例の場合なら完全に redundant だとしてむしろ積極的にappleを除外してほしい
>>87 できそうな気がするけど。
…-> Pen のような関数がないって事がわかってて、
penの型定義も限定されてるから、そこに書くことのできる値は限られてる。
>>85 その絞り込みの是非は置いておくとして、「参照透明」と「絞り込み」の関係がよく分からん。
その例だと、参照透明である必要はないと思うが。
>>89 そうだね。絞り込みについては静的であれば充分。
参照透明なら実行中に値が変わることがないから、例えばShowしたものを補完候補としてリストアップできる。
id やら const やらの問題はさておき
そこでもし仮に apple に絞られたら相当イラつく
>>88 その例なら簡単にできるけど、一般的には相当厳しいと思うよ。
型がシノニムだったら、辿って元の型を探さないといけないね。
import されてたら、それも全て辿らないといけないね。
template が使われてたら、展開しないといけないね。
Cプリプロセッサが使われてたら、これも展開しないといけないね。
型を決定するのに関わる事は他にもいっぱいある (言語拡張とか)。
あと、参照透明は破られないという前提で話してると思うけど、
unsafePerformIO 関数があることを忘れないように。
まずは自動車を二人で運転したり、独裁者が二人いる国を作ってみればいいのだ
それができたら一人を機械で置き換えて人間+機械のコンビを作る
>>94 作れるよ。
フレームワークもいくつかあるし、入門書もある。
webフレームワーク周りは一時期乱立とは言わないまでもだいぶ混乱してた印象があるけど
最近の流れはどうなってるんだろうか
すみません、ある型とその取扱い関数の
標準・追加ライブラリでの有無の確認なのですが、
実数の範囲を表す型で(A,B)というのがあったとして
A以上B未満の範囲を示していて、
それがリストに[ s1, s2, s3, s4 ]の様に並べられているとして
その中身は[(0,1),(1,2),(2,4),(4,8)]としますと
実数「1.5」はこのリスト3番目の変数が示す範囲に
含まれますと教えてくれる関数なのですが、
このような型と関数があるライブラリを知っていましたら
教えて下さい。
>>97 ライブラリ探す暇があったら自分で書いたほうが早いだろ
import Data.List (find)
type Range = (Double,Double)
blah :: Double -> [Range] -> Maybe Range
blah x rs = find (¥(inf,sup) -> inf <= x && x <= sup) rs
ranges = [(0.0,1.0),(1.0,2.0),(2.0,4.0),(4.0,8.0)]
main = print $ blah 1.5 ranges
辞書ファイルから欲しいデータを抜くのに使ってるけど、
Haskellだとライブラリ使うというより、
スクラッチで欲しい関数を書けるのが良いね。
調べるより作った方が早いし細かい調整がきく。
>>92 参照透明性を破壊するようなunsafeの使い方はするべきじゃない。
利用者に、穴の空いたトランポリンで跳ね回れと言ってるようなもんだぞ。
>Haskellだとライブラリ使うというより、
>スクラッチで欲しい関数を書けるのが良いね。
> 調べるより作った方が早いし細かい調整がきく
小さいパーツ程度ならね
>穴の空いたトランポリンで跳ね回れ
いいなこれ。今度から使わせてもらうわ
>>106 それは分かってる。
その意見には俺も全面的に賛成だよ。
ただ、やろうと思えばできてしまうんだよ。
例えばコマンドラインパーサーの CmdArgs パッケージでは unsafePerfirmIO が使われてる。
(なかなか使い勝手が良いライブラリなのに玉に瑕で残念)
だから、参照透明が保たれているという前提で補完機能を作るわけにはいかない。
一般的には透明性が保たれてるならunsafeを使っても大丈夫だよね。
FFIでCのライブラリを使って値を取ってくる時に、引数で返り値が一意に決まるならば、必ずしもIOで包まなくてもいい。
補完システムでは、プログラミング中に値を得ることを考えてるので、制限はもっと厳しい。
悪意のある誰かがコード中にunsafePerformIOでディスクを皿にするコードを入れていたとする。
現状では実行しなければ問題ないけど、その補完システムではエディタに読み込んだ時点で… ふっ飛ぶ!
アドバイスは的を得ていると思う。指摘を受けて、SafeHaskellでのみリッチな補完が出来る。という回避を考えているよ。
>>109 CmdArgs パッケージは、初見だけど… うーん。なぜこんな風になってるんだろう。
IOにするわけにはいかんのだろうか?
Haskell使ったプロダクションコードにしばしばあるやつね
環境変数みたいなのは Reader で引き回すよりさっくり
unsafePerformIO でアレするのがアレでね
>>107 >小さいパーツ程度ならね
その小さなパーツを見通しよく組み合わせられるあたりが功徳なんでねえ
unsafePerformIO取締法違反でタイポする!
コンパイラがしゃべった!?って、ただの腹話術か
いっつも腹話術してるな
>>101 >>102 ありがとうございます。
書いて下さったコードを参考にし、利用させて頂きます。
>>112 そんな事すると、何のために Haskell を使ってるのか分からん
じゃあ「分かるHaskell」と「分からんHaskell」の両方を使いこなせばいいよ
そういう多様性を何のために肯定するのかっていうと
未知の新しい言語を見た瞬間に使いこなすための練習だと思えばいいんじゃないか
>>120 そういうのは趣味や個人の時間にやって備えておくもので、
プロダクション(本番)でやるものではないと思う。
まあ、プロダクションだとやっぱり時折 unsafe 唱えるわけだけど
どういうときに唱えても已むを得ないかの知識が秘伝のタレ化してる感はある
x = unsafePerformIO m
main = do {
safe_x <- return $! x;
...
}
これで無難な値を無難なタイミングで取り出せる
ただし、mainを2回実行したらmは何回実行されるべきかの知識が秘伝
unsafeReadとunsafeWriteの詳しい説明や使い方がわかる書籍やサイトがあれば教えてください
グローバル定数とみなせる値を取得したい + 使う場所がMonadIOでない + 設計変更の時間はない
使用したいというより読みたいんだよ
ありのままの現実を読む主義
現実を操作するつもりはない
そうならなくて済むよう、普及にもう少し力を入れる必要があるよね。
何があれば賑わうかって考えたんだけど、やっぱりもっと和書が必要ではないか。
「Haskellでゲームを作る本」とか「Haskellで解る圏論入門」とかどうだろう。
Haskellなら三ヶ月後、自分で書いたコードを読めます
>>131 そんな楽観はできない。
3ヶ月後も読めるようにするには、それなりのコードを書かなければならない。
Haskellなら自然にそういうコードになる、なんてことは全くないよ。
1つの関数に複数の仕事をさせてしまったり、
let節やwhere節で計算のフローを書いて関数を肥大化させてしまったり、
逆に一行に押さえようとポイントフリーをやりすぎて暗号化してしまったり、
仮引数の名前を短くしすぎて役割が分からなくなってしまったり、
モナド変換子のスタックをややこしくしてしまったり。
意識していないと陥りやすい罠は幾らでもある。
>>132 いや、131は揶揄・皮肉だと思う。何スレか前にあった俗説「Haskellでは3ヶ月前に書いた自分のコードが読めなくなる」に対しての。
理由は確か、Haskellでは習熟するにつれてコードが全然違ってくるから、だったかな。
未熟だった頃の考え方とかをスッカリ忘れてしまうので、読んでも頭に入ってこない。
133のコードから漂う、Java上がり臭… 真面目に書いたのも見て取れるんだけど、標準の関数や表記法とズレているのでどうにも読みにくい。
いまstackのコードを読んでるんだけど、意図してコードのレベルを抑えてるフシがある。const を使わずに \_->... と書いてたり。
練度の高低でコードが違ってくることはある意味で良いことといえるのかもしれないけど、多人数で使う際には難しさがあるようだ。
https://ideone.com/q2RCBe これは
>>133 のほぼ 1/10 の行数で書かれている
solve = build “” “”
という行を見て
「ああアキュムレータが2つあるのね」
とわかるのであとはそのまま読むだけ
というか、
>>133 のコードはこれはネタでわざとやってるな
自分で書いたコードが、他人が書いたコードと同じに見える
これは普通
同じ書き方をしない方が異常
3ヵ月前の時点ですでに他人が書いたコードと同じに見えていい
>>135 Data.Mapでもっと単純に書けそうな気がしたけど気のせいだった
https://ideone.com/R4dQIW >>124 稟議のロジックをHaskellで書いてくれ。
アキュムレータのように引数で変数束縛するのはprologっぽい書き方
haskellならアキュムレータの代わりにwhereを使う手がある
makeMaximumSizeAndMinimumOrderPalindrome wordlist = xs ++ [y] ++ zs where ...
Intellij IDEAのIntellij-Haskellプラグインが上手く実行できなくて諦めかけてたけど改めて挑戦したらやっとできた
これで俺もIDEデビューだ
開発効率上がるといいな
アキュムレータの意味がわかってないキチガイがいるのか……
ByteStringについて、↓の記事に
「使い方の結論を述べると、入力には正格 ByteString、出力は遅延 ByteString を用います」
と書いてあるのですがそうなんですか?
だとしたらなぜそうなるのか教えていただけますでしょうか
http://d.hatena.ne.jp/kazu-yamamoto/touch/20110525/1306298046 CodinGameをHaskellで攻略した方の感想ください
https://www.codingame.com/ Prelude> let a = 0.3 - 0.2
Prelude> let b = 0.2 - 0.1
Prelude> let c = a == b
Prelude> print c
False
は?
Prelude> default (Rational)
Prelude> let a = 0.3 - 0.2
Prelude> let b = 0.2 - 0.1
Prelude> let c = a == b
Prelude> print c
True
満足〜♪ 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
> 入力には正格 ByteString、出力は遅延 ByteString
これ俺も疑問に思ってた
実装上の都合です
理論的には何の根拠もございません
メモリ的には入力遅延のほうがよさそうだけどハンドルをすぐ解放するために正格ということかな
512MB of zeroes with different implementations of echo
出典はHaskell High Performance Programmingです
>>151 正格ByteStringが遅延に買ってる部分ないのか
普通に配列とリストの違い
ただしリストの要素は32kの配列
WAI の実装とかそういう凄え特殊な場面での話だろうな
リソース管理が死活の場面では Lazy IO がワリと死ねるので
でもそういうのはいまなら各種の streaming ライブラリでOK
foldr と foldl ってこんな風に作れるよね。
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr _ i [] = i
foldr f i (x:xs) = f x (foldr f i xs)
foldl :: (b -> a -> b) -> b -> [a] -> b
foldl _ i [] = i
foldl f i (x:xs) = foldl f (f i x) xs
なんで foldl より foldr の方がメモリ効率がいいのか分からん。
どっちも結果の値が評価されるまで式が数珠繋ぎになったままじゃね?
今はコンパイラに解決させるようにしているようだね
haskell - Foldl memory performance in GHC 8.0.x - Stack Overflow
https://stackoverflow.com/questions/42747159/foldl-memory-performance-in-ghc-8-0-x 中身としてはこれかな
foldlを直す - 純粋関数空間
http://tanakh.jp/posts/2014-04-07-foldl-is-broken.html >>158のように素直に定義したらどっちでも変わらないのはその通りで、
foldlの方は末尾再帰の形になってるからseqすることでいい感じに動いてくれる
>>162 >
>>158のように素直に定義したらどっちでも変わらないのはその通りで、
やっぱり。
これを聞いて安心した。
みんな、ありがと。
foldlを使うことってほぼない気がする
だいたいfoldl'を使ってる
>>160 その問題は、要するにグラフが準オイラー路になっているかどうかを判定するものだよ。
各駅を頂点、各路線を辺とするグラフが、
準オイラー路であれば彼らは計画達成できるし、
そうなっていなければ計画は達成できない。
グラフが準オイラー路であることと、
次数が奇数の頂点がちょうど2つ存在することとは同値。
要するに、一筆書きができるかどうかだよ。
Haskell で素直に拙くプログラムしても特に問題ないだろうね。
たとえば、N個の要素を持つInt型配列にaccumArrayで次数を集計して、
filterで奇数だけ濾し取り、要素数を調べる。
>>164 最適化で正格になるはずだけど明示的に正格版使う必要ある?
>>160 すまん、準オイラー路を判定する前に、
連結グラフかどうかを調べる必要があった。
>>160 >>168 準オイラー路かどうかを判定する前にと言ったけど、
後の方がいいな。
正確には、次数が奇数の頂点がちょうど2つあることを確認した後で、
その2つの頂点間に道があればOKとする。
これなら、そう面倒でもないような気がする。
>>169 ごめん、ダメだな。
素直にシードフィルみたいに辿っていくしかないか。
>>160 Haskell が得意なアルゴリズムは分割統治なので、
できるだけ分割統治で解けないか考える、
というのが一般的なアプローチ。
だけど、この問題はそれでは解けそうもないので、
他の命令型言語と同じアルゴリズムを使うしかないと思う。
で、これは一筆書き問題なので、
「連結グラフがオイラー路かまたは準オイラー路なら一筆書き可能」
という定理を利用することになる。
オイラー路や準オイラー路の判定は簡単。
肝は連結グラフの判定だけど、これはもう素直に調べるしかない。
普通ならグラフ用ライブラリを使うところだけど、
競技ならまず使えないだろうから、2次元配列を使ってグラフを表現する。
そして頂点をひとつ決めて、そこから全頂点を辿れるか調べる。
これしかないね。
Haskellにはとことん向かない問題だと思う。
Haskellわからんからわからんのだがこれとか簡単にかけてそうなんだがそうでもないのか?
https://yukicoder.me/submissions/213035 >>174 よく見たらWrong Answerだったわ...orz
>>165-175 助言ありがとうございました
Haskellは分割統治が得意、連結判定苦手で覚えます
連結判定だけじゃなくてグラフがらみは総じて苦手じゃないかな
コンパイラはグラフ簡約するのに言語はグラフ苦手なのかよお
つうか制約のない連結性の判定を深さ優先探索でするのは別にHaskellのせいじゃないだろ
グラフ苦手って競技プログラミングで使う場合のみやろ?普段使う分にはグラフライブラリに突っ込めばいいだけやし気にする必要無いやで!
Data.Array.(!) や Data.Vector.(!) って O(1) でアクセスできるんですか?
純粋な関数型言語でそんなこと可能なのですか?
>>182 その方が面白いからだと思いますよ。
コードゴルフとかと同じですよ。
制約があった方が燃えます。
>>183 >Data.Array.(!) や Data.Vector.(!) って O(1) でアクセスできるんですか?
>純粋な関数型言語でそんなこと可能なのですか?
読む分にはO(1)に決まってる
そもそもData.Vectorのドキュメントに様々な関数の計算量が書いてあるだろ
>>185 要素数に依存しない計算量で構造から読み取るなんて、
純粋な関数だけでどうやって実現するの?
不思議すぎない?
はあ?
インデクスからメモリ上の位置(たとえばポインタ)へのO(1)な関数があればいいだけだろ
通常の配列もハッシュも変わらん
ライブラリとして提供されてるからそうであって、
Haskellの構文としては書けないって話では?
>>187 そのO(1)な関数は純粋関数型でどうやって実現してるの?
俺はすげー不思議、という話だよ。
純粋データ型のオブジェクトはすべて構築物
(つまり既存のオブジェクトから構築されたもの)
という視点を持たないとこの手の話は一生理解できんと思う
>>192 このあたり、「純粋関数型データ構造」って本で勉強できる?
それともあの本は関係ない?
1 = \x _ _ ... -> x
2 = \_ x _ ... -> x
3 = \_ _ x ... -> x
~
という自然数を定義すれば
\i -> i a b c ...
で参照O(1)な配列の出来上がり
>>194 それじゃあ、Data.Vector みたいに動的に生成できないでしょ。
ワザととぼけてるの?
それとも話の流れ分かってない?
>>195 \x y z ... -> \i -> i x y z ...
C言語で実装してラップしてんじゃないの(知らんけど)
>>196 すげーおまえ頭いいなって思ったが、すまん、
こっちの頭が悪すぎた、まだ何となくしか理解できん。
たとえば、リストから一次元配列を作る関数をつくってくれないか?
ずうずうしいと思ったら、ヒントだけでも。
fromList :: [a] -> 配列型 a
fromList xs = ムニャムニャ
C言語で実装してラップしてんじゃないの(知らんけど)
>>198 いやチャーチエンコーディングのパクリだよ
fromList xs = foldl ($) (\x y z ... -> \i -> x y z ...) xs
実際は型チェックが通らないからアキュームレーターの関数を
data Func a b = Res b | Func (a -> Func a b)
みたいな型で作って結果をパターンマッチすればいい
>>200 ありがと
あかん、頭の中で考えてても理解できん、
と言うかスッキリしない。
家に帰ったらじっくり勉強してみるよ。
>>202 上の問題でverticesとreachableの長さを比較すればと思ったら
verticesは辺の無い頂点も列挙する仕様だったわ
まあGraphの中身はリストの配列だから自分で数えればいいんだけど
関数合成ってhoge.piyoよかhoge . piyoの方が可読性高い?
>>204 スペース無しドットはモジュールの名前空間の表現に使うから
関数合成は後者で書く方がいいよ
モジュール名は大文字で関数名は小文字だからコンパイラは間違えないけど
hackageのソースコード見ても合成のドットは離して書いてるの多いね
>>205 やっぱりそうですか
ありがとうございます
人間も間違えねえよってつっかかってくる人昔みかけた
そういう人が出たら、宗教戦争やめろっていうつもりだったのに
「大文字と小文字を間違えない」の主語は何かの戦争か
そもそも主語を書く必要があるのか
最初の文字が大文字やドットなら特別な意味がありそう
最初ってどこなのかは正規表現で定義すれば間違いなさそう
リスト内包表記がdo表記に一対一に対応するのは知っていますが、
言語拡張 TransformListComp によって拡張されたリスト内包表記も、
一対一に対応するdo表記があるのでしょうか。
then group by e using f の働きがどのような仕組みなのかよく分からないので、
対応するdo表記を調べて理解を深めたいです。
>>212 >対応するdo表記を調べて理解を深めたいです。
どうぞそうなさって結果をスレにてご報告ください。
>>213 いろいろ実験したり、GHCのユーザーガイドを読んだりしたところ、
then group by p using f の働きが理解できました。
しかし、結局のところ対応するdo表記は分かりませんでした。
そんなものはもともと無いのかもしれません。
もしかしたらCoreを出力してみると何か分かるかもしれませんが、
自分の中ではもう問題が解決しているので、そこまで調べるモチベーションがありません。
なので、ここでその結果を報告することはできません。
代わりに、then group by p using f がどのような働きになっているのか、
私の知見だけでも述べた方が良いでしょうか。
https://downloads.haskell.org/~ghc/7.8.3/docs/html/users_guide/syntax-extns.html#monad-comprehensions
> D[ e | Q then group by b using f, R ] = f (\Qv -> b) D[ Qv | Q ] >>= \ys ->
> case (fmap selQv1 ys, ..., fmap selQvn ys) of
> Qv -> D[ e | R ]
> where Qv is the tuple of variables bound by Q (and used subsequently)
> selQvi is a selector mapping Qv to the ith component of Qv
別にモナドで定義されてるからdoで定義してもいいけど
Qvから要素を取り出す方法がアドホックにしか書けないから
doを使わないにしろ一対一で対応するようには書けない
>>217 MultiWayIfとBinaryLiterals以外は可読性落ちとるやないかーい
>>212 です。
then group by p using f の働きはいろいろ不思議な部分があるのですが、
すべての疑問は、then group by p using f で使う関数 f :: (a -> t) -> [a] -> [[a]] の第1引数は
どのような関数が渡されるのか、ということに集約されました。
(それが分かって初めて、これは then f by p の f でも同じだと気づきましたが、
こちらでは理解につまづかない程度の簡単な例しか扱っていなかったので)
この関数 f は、then group by p using f が現れるより左にある全てのバインダを要素に持つ組から p への関数
と考えれば納得がいきました。
たとえば、
[ (x, y) | x <- [1,2,1], y <- "ok", then group by x using groupWith]
ですと、then より左のバインダを要素に持つ組というのは、つまり
<1, o>, <1, k>, <2, o>, <2, k>, <1, o>, <1, k> といった組です。
(実際に内部で使われている実際のデータ型は分かりません)
このような組から x への関数なので、
g <1, o> = 1
g <1, k> = 1
g <2, o> = 2
g <2, k> = 2
という関数です。
このような関数 g が groupWith 関数の第1引数に渡されると考えると辻褄が合いました。
haskell始めてみたいんだけどまだプログラミング能力があまりないので不安
他の言語をどれくらい書けるようにしておくべき?
むしろ手続き型言語に慣れ親しんだ脳みそだと関数型は取っ付きにくいから
いきなりHaskellでいいと思うよ
>>221 Masterminds of Programming という本で Haskell 委員会のひとりが、
他言語をちゃんとできるヤツはHaskellも上手く使える、という趣旨のことを言ってた。
>>221 それどころか、いきなりHaskellをやるのはお勧めしない感じだった。
>>222 「ちゃんと出来る」の意味が、常人と違う予感。
いきなりHaskellの難点はどのHaskell入門書籍やサイトも基本的なプログラミング知識を前提としちゃってるとこかな
変数とか関数とかリストとかマップとか
でもHaskellというか関数型パラダイムにできるだけ早い時期から触れとくのは良いことだと思う
>>220 『プログラミングの基礎』浅井健一
でOCamlやってからHaskellに逝くのが一番簡単な導入
Haskellは日本語どころか
英語でググっても答えが見つからない問題にぶち当たる率が
他のメジャーな言語と比べると高すぎるから初学者向きじゃないよ
もくもく会に参加したり、Stack Overflowで質問したりと
双方向的な方法を挟まないと一定以上に到達するのは難しい
問題自体が難しい
だから答えが見つからない
と解釈するのが自然
問題自体をよく見ようとせず、SEOや脳味噌のことを考えるのは的外れだと思う
ocamlの元のmlで挫折しそうになった。
f#がたのしい
例えばC言語の楽しさを1とすると
haskell,ocaml,f#の楽しさはどれぐらい?
F#はC#の知識を前提とすることを許可されている感がある
箸の上げ下ろしどころか知識を得るのにも許可を必要とする異常な環境に適応したのがF#
f#はなんかこう昔懐かしbasicの関数型言語版のよう
な気がする。
>>234 たとえば、どんな構文が?
遅延評価とか参照透過性とか厳密な型付けとか、そういうのを嫌う人はいっぱいいたけど、
構文が嫌って人には初めて出会った。
F#固有のライブラリ使ったことないな
構文的にC#よりF#楽
あとはHaskell並みの肩推論あれば文句ないんだけど
Haskellは遅延評価使いどころを見つけづらい
インデントルールにたまにハマるくらいかな
一応ブレース&セミコロン方式でも書けるようだが
合成関数を左から右に書きたい
何か数学でそんな書き方もあったと思うんだけど忘れた
Control.Arrow の (>>>) 演算子使えばいい
($) の引数入れ替えたヴァージョンなら Data.Function の (&) 演算子
>>239 >一応ブレース&セミコロン方式でも書けるようだが
標準的なコーディングスタイルだと使わないからなあ……
コード生成のときなんかには便利だけど
Preludeに引数を入れ替えるというだけの関数なかったっけ?
マニアック過ぎて忘れてしまった
Haskellが競プロで得意なグラフ問題がatcoderでマラソン形式で出題されているらしい
競プロでHaskell使ってた人は皆Rustに移ったイメージ
競プロは普通に手続き型かつ破壊的の方がいいもんな
入力範囲も固定だし、Haskellで挑む理由がない
関数型っぽく書くと実装が一瞬で完了する簡単な問題が結構あったりはする
競プロより Project Euler で付けた力の方が将来の糧になりそう
Haskellはアルゴリズムをうまくfold系で書ければ
融合則とかで綺麗さと速度を両立できる感じになるけど
うまく書けないとSTRefとか使うことになって
なぜHaskellやってるんだって気分になる
>>252 fold系には合わない計算があるのは分かる。
でも、なぜそれでSTRefを使うことになるのかが分からない。
別にIORefやSTRefを使ったっていいじゃない
FFIだってポインターだってあるじゃない
ただしStateモナド、テメーはダメだ
よく知らないけど
カーソル的なクラスと同じように使えるんじゃない?Stateって
Stateモナドに入るのがインスタンス生成で>>=がメソッドコール
1 s -> (a, s)
2 s -> (a -> s -> s) -> s
3 (a -> s -> s) -> s -> s
4 (a -> s -> s) -> s -> [a] -> s
1がStateで4がfoldr
Haskellって他人のコード読むと
▲ a b = □ . ○ $ map ■ $ (△ a) $ ▼ $ ◎ b []
where
◎ b xs = 〜長い処理〜
こんなんばかりで脳がパンクするんだが
むしろ他人のコードでも割とサクサク読めるのがHaskellのメリットじゃね?
>>259 せっかく参照透過性が保たれているのだから、自分が読みやすいように、
でも式の意味は変えないように変形すればいい。
複雑なコードに出会って、それでも理解したいという欲求があるのなら、
取りあえず脳がパンクしない程度の小片にまで分解してみればいいんじゃないか。
なるほど処理を理解しきっていなくても
他人のコードを自分が読みやすく変形出来るのが参照透過性のメリットなのね。
その発想はなかったから今度から試してみる。
>>255 foldに乗らない処理ってのが
要は愚直に再帰で書いてるループ計算で、
破壊的更新をしないとものすごいGCが走ってつらいということがあった
(データ構造にもっと工夫の余地があったとは思う)
実際再帰って最終手段だよね。
入門者向けには基本みたいに言われている謎。
Haskellってループないんじゃなかったけ
再帰なしでどうやって組むんじゃ
>>266 リストで言うならmapとかfoldlあたりで対応できるならそれを使えばいい
ユーザー定義の再帰関数は自由度は高いけど終了条件を見落とす可能性もあるし、場合によっては末尾再帰やら正格評価やらも気にせんといかん
必要としている仕事より強く自由度が高い関数や型をあまり使わない方がいいのは他言語と同じ
直近で書いた120行程度で関数定義25個を含んだコードを見返したが、確かに再帰は一箇所もなかった。
要するに集合演算があるから繰り返す必要がないということか
再帰はいいんだけど関数定義をトップレベルに並べるとまるでgotoのように見える
しかしletは使うな、caseは使うなという人もいるから
消去法で高階関数かな
再帰と言えば、今 haskell.org のサイトのトップにある prime の定義って素敵だよね。
こういう宣言的で自己説明的なプログラムが普段のコードでも書けるように精進したい。
以下で、なぜエラーが出るのかがわからないです。
import Data.Typeable
f :: (Show a, Typeable a) => a -> String
f a = if typeOf a == typeRep (Proxy :: Proxy String) then a else show a
以下のようにすると、なぜかうまくいきます。
f a = if typeOf a == typeRep (Proxy :: Proxy String) then read $ show a else show a
>>272 前者で then a else show a としているから、a は String 型でしかありえない。
一方、型シグネチャにより、a は String 型以外の型も認めている。
矛盾している。
試しに前者を、型シグネチャを書かずに関数定義だけ書いて、ghci の :t で型を調べてみよう。
次回から、エラーの内容も書こう。
そこにエラーを出してくれるのがHaskellの良い所
動かす前に叱ってくれるって素晴らしい
>>271 数学的な定義をそのまま書いて動くっていうのは確かにかっこいいところ
その代わりあの定義では正しい篩になってなくて割と遅かったはず
ちゃんと書くとこんな感じになる
primes = 2:(section [3..] composites)
where
composites = union [multiples p |p<-primes]
multiples n = map (n*) [n..]
section (x:xs) (y:ys)
| x < y = x : (section xs (y:ys))
| x == y = section xs ys
| x > y = section (x:xs) ys
union = foldr merge []
where
merge (x:xs) ys = x:merge' xs ys
merge' (x:xs) (y:ys)
| x < y = x : merge' xs (y:ys)
| x == y = x : merge' xs ys
| x > y = y : merge' (x:xs) ys
>>277 かっこいいコードだけど
省ける計算が多い分まだ試し割の方が速いんだな
primes = 2 : filter isPrime [3..]
isPrime x = all ((/=0) . (x`mod`)) $ takeWhile ((<=x) . (^2)) primes
数が大きくなればmodのコストが問題になるのかもしれないけど
>>278 かっこいいの? どの辺りが魅力的なん?
一応言っとくと
>>277 はRichard Bird がよくあるヴァージョンを批判されてきちんと篩を書いたコード
でも解りにくいじゃん!
Haskell知らなくても何をしてるか
勝手に分かってしまうコードが宣伝用には理想
そういう視点でも
メモ化フィボナッチコードは神コードだね
フィボナッチってどこで使う場面があるのさ?競プロ?
>>282 それは
>>276 が「その代わり」ってちゃんと断ってるじゃん。
たいていの場合、両立なんてできないんだよ。
メモ化フィボナッチが希有な例なんだよ。
>>283 全くない。
だから、学ぶべきはフィボナッチ数列の作り方じゃなく、
宣言性を壊さないままメモ化する技術の方なんだが、
あの本にはその辺りのことは書かれていなかったような気がする。
メモ化フィボナッチは単なる例にとどまってたんじゃなかったか。
f1 = (map f1' [0..] !!)
where
f1' 0 = a
f1' n =〜
の形は
f2 n = foldl' f2' a [1..n]
where
f2' n =〜
より分かりやすい。
import Data.List (foldl')という
余計なインポートが不要なのが最高。
ghcコマンドやghciコマンドの出力メッセージの中で、
引用符が倍角文字になってるんだけど、これ半角に設定できないかな。
ターミナルで使ってるフォントの関係でかなり読みにくい。
わかりやすいもなにも map で畳み込み計算をどうやって書くつもりなんだろ
できなくはないけど余再帰使うはずで、そうなればもう map とかそういう問題ではない
というかscanlをmapで再実装するのがそんな最高なのかしら……
foo (x:xs) = 〜(なんか関数)〜 (x:xs)
と
foo a@(x:xs) = 〜(なんか関数)〜 a
と
したとき、前者と後者は内部的に処理違ったりする?
>>289 GHCの処理方法が分からないなかで、
それでも違うかどうかを調べるには、たとえば次の方法がある。
・Coreを比較する
・プロファイルを比較する
・バイナリを比較する
>>288 普通ならリストが空か否かの場合分けで2行ぐらい書くところを
余再帰なら1行で書けるんだろ
>>224 C++ちゃんとできる
(ガサガサッ
(ビュンッ!
C++ちゃんってあれだろ?
「ブーストかけるぜ」なCちゃんの別人格
Haskellちゃんも見たかったなぁ…
>>289 ghci -ddump-simpl で起動して、問題の関数定義を let 束縛してみたら
Coreのレベルで完全に同じだとわかる
まあ、そりゃそうだろって感じだが
f (x:xs) = (x:xs) → case 引数 of _ -> x : xs
g a@(x:xs) = a →
だと
ミスった
ghci -ddump-simplだと
f (x:xs) = (x:xs) → case 引数 of _ { (x:xs) -> x:xs }
g a@(x:xs) = a → case 引数 of a { (x:xs) -> a }
みたいなのが出力されたけど・・・
やってみた
https://ideone.com/6r6LpA @パターンは不可反駁なんで、少しだけ違うね
9行目と31行目で a は不可反駁なんでワイルド扱い
15行目と37行目もまさに同じ点が違う
stackoverflowで聞けば識者が的確に答えてくれそう
《問》(配点 10点)
\n -> 1 + n
\f n -> f 1 n
\f -> f 1 . (\g n -> g 2 n)
らはスーパーコンビネータである。しかし、
\f g -> f 1 . (\n -> g 2 n)
はスーパーコンビネータではない。何故か?
《ぼくの解答》
g がラムダ抽象のスコープ外で束縛されており、そのスコープにおいて自由変数である。
従ってこのラムダ抽象は閉じた項ではないのでコンビネータではない。
コンビネータでも定数でもないのでこのラムダ抽象はスーパーコンビネータではない。
全体としては、定数でなく、されどコンビネータではあるが、その内部にスーパーコンビネータでないものを含んでいるのでスーパーコンビネータではない。
何点貰えますか?
訂正(一行目)
× g がラムダ抽象の〜
○ g が括弧内のラムダ抽象の〜
>>302 ¥n1 n2 … -> E
がスーパーコンビネータであるのは
(1)Eに出現する自由変数が n1〜n2 だけであって、かつ、
(2)Eに現れるラムダ抽象がスーパーコンビネータであるとき、
そしてそのときに限る。
¥f g -> f 1 . (¥n -> g 2 n)
の場合、 ¥n -> g 2 n は g が(1)を満たさないのでスーパーコンビネータではなく、
したがって(2)によって、それを含む全体がスーパーコンビネータではないこよになる。
スーパーコンビネータの定義ないし必要十分条件を示してないと減点するのが普通。
ああ……
(2)Eに現れる「すべての」ラムダ抽象がスーパーコンビネータであるとき、
だ。肝腎のとこが抜けてる……寝よう……
>>305 Haskell High Performance Programming には、
A supercombinator is either a constant, say 1.5 or ['a'..'z'], or a combinator whose subexpressions are supercombinators.
と説明されてますが、これは嘘なのですか?
>>308 それだと
¥x y -> (x + y)
ですらsupercombinatorにならんよ
むむむ…
(x+y)に現れる全てのラムダ抽象とはなんですか?
>>310 この場合、(x+y)にはラムダ抽象が現れていないので条件(2)は空虚に充足されている
あとは条件(1)も充足されてるから、スーパーコンビネータになる
>>308 subexpressionの定義が曖昧だな
例えば \ y -> x は \ x y -> x のsubexpressionか?
純粋関数型どころか関数型言語のTDD本が無いのですが、
Java用に書かれた本に載っている方法論のどは、
Haskell で TDD を行う際にも取り入れられる事は多いですか?
例えば最近出た「テスト駆動開発」(Kent Beck著)など。
最初の方をチラ読みしたところ、大変読みやい印象を受けたので、
参考になればいいなと思いましたが、どうでしょうか。
次の型があるとします。
data T = D1 {d1a :: Int, d1b :: String} | D2 {d2a :: Char, d2b :: Double, d2c :: Integer}
同じデータコンストラクタ由来の値同士の比較関数を次のように作るとします。
smallerThan :: T -> T -> Bool
smallerThan t1@(D1 _ _) t2@(D1 _ _) = d1b t1 <= d1b t2
smallerThan t1@(D2 _ _ _) t2@(D2 _ _ _) = (d2b t1, d2c t1) <= (d2b t2, d2c t2)
smallerThan _ _ = undefined
これを、D1 や D2 の定義内のフィールドの順を変えたり、フィールドの数が変わったりしても、
smallerThan 関数の定義は修正しなくても良いようにしたいのですが、方法はあるでしょうか。
要するに、パターンマッチにおいてデータコンストラクタ名のみマッチングテストをしたいのですが・・・
>>314 言語拡張 PatternSynonyms,RecordWildCards を使うといけるようだよ。
pattern D1_ <- D1 {..}
pattern D2_ <- D2 {..}
として、後は t1@D1_ t2@D1_ のようにパターンマッチして利用する。
ていうか、 拡張使わなくても空レコードでパターンマッチできたはず
smallerThan (D1{}) (D1{})
みたいに。
なるほど、空レコードでマッチングできる事を知りませんでした。
ありがとうございました。
ある名前の型がどのモジュールで定義されているのか、
あるいはまだ定義されていないのかを hoogle で調べる事は出来るでしょうか?
実際に hoogle つかってみりゃいいじゃないか
>>320 すみません、かなり恥ずかしい勘違いをしていました。
できました。
tanakhにはもっとhaskellの話をしてほしいよ
GHCで、モナドの各インスタンスの(>>=)関数などの、型ではなく実装を見たい場合はどこを見ればいいのでしょうか
特にIOモナドが気になってます
>>326 >>327 おお、ありがとうございます
重ね重ね申し訳ないのですが、これによるとIOモナドの(>>=)はbindIOでbindIOは
bindIO :: IO a -> (a -> IO b) -> IO b
bindIO (IO m) k = IO (\ s -> case m s of (# new_s, a #) -> unIO (k a) new_s)
となっているのですが、ここでcase式を使っているのはどういった意図があるのでしょうか
letと同じ使い方ですか?
caseは先に式を評価してからパターンに含まれる変数を束縛する
でもletには再帰があるかもしれないから先に変数束縛する
その変数を含むかもしれない式は遅延評価する
>>329 なるほど、そうだったんですね
勉強になりました、ありがとうございます
Stack の LTS 9.17 に repa って無いのな
stackでパッケージをインストールする時にコンパイルしなくなったって話を聞いたけど本当ですか?
バイナリをダウンロードしてインストールするみたいな?
化石スペックの俺のパソコンでshellcheckのインストールで8時間以上かかった悪夢は解消されるの?
Haskell->圏論って流れはあるけど
圏論やっててHaskellに興味を持つ人もいるのかな
圏論が何に役立つのか知らんけど、苦労して学んだ人が振り上げた拳の行き場が見当たらなくて
たまたま目についたHaskellをぶん殴ったんじゃないの
それは道端の石ころを蹴っ飛ばすように
数学は案外行き当たりばったりに問題が解決されている
圏論で判明した同型について、ある分野で解決されていて
ある分野においてすっぽ抜けているところがあれば、その問題は解決できるとみなせる
このように現状のとりとめのない数学を整理するために圏論はあると言えるかもしれない
よって圏論自身から新たに得られる情報はあまりないだろう
だからあまり研究も進まない・・・
圏論自体はものの見方とそのための記号だから、
圏論使ってる時点で、自分の応用分野もってるでしょう。
その場合、
圏論 -> universal algebra
圏論 -> functional programming
圏論 -> categorical stochastic relations
圏論 -> haskell
のように興味の対象が増える程度でhaskellだということに意味はなさそう。
圏論的アプローチは他の言語でもライブラリ群いろいろあるしね。
bakeの開発が終了したようですが、
同じ趣旨のライブラリは他にありますか?
この会社って言うたらそこまでの規模じゃないだろうし実態もよく分かってない感じなのに
なんつーか、『ある傾向の人間性』の社員が現時点ですら目立ち過ぎだろ…
こぃぬ㌠ @Altalinux
スパコンに詳しくない人間がスパコンを語って
つい昨日PEZYを知ったような人間が補助金やら助成金やらを語るんですねえ地獄のような構図ですねえ
Hideyuki Tanaka @tanakh
まじで特捜は「詳しい技術者」が「使い物にならないスパコン」に「巨額の資金」が流れてるというタレコミだけで、
オッそれは絶対におかしいなとか先走ったけど、調べても思ったようなのが出てこなくて困ってるんじゃないのか。
山田てるみ @telmin_orca
つまりこの件は、アベガーとかカネノナガレガーとか言っておけば良いのであって、
技術的にどうとか言った瞬間に全力で殴られる案件だということだ
Hishinuma @Hishinuma_t
例のPEZYが100億円不正受給の記事が何の謝罪もなく差し変わっている。
http://www.data-max.co.jp/291219_dm1545_2/ …
tanakhさんはhaskellの日本での普及に貢献された方かもしれませんが
tanakhさんが勤める会社PEZY computingはhaskellとは関係ないのでは
初心者なのでtanakhさんって方を知らないのですがどんな方なんですか?
tanakhさんは『すごい Haskell たのしく学ぼう!』の翻訳者の1人の田中英行さんのハンドルネームだよ
https://twitter.com/tanakh ちなみにもう1人の翻訳者の村主崇行さんは今年亡くなられた
http://www.asj.or.jp/tennet/archives/msg07622.html tanakhは簡単に言うとプログラミングが得意な屑
>>348 今すごいHaskellの訳者紹介見直したら村主さんのコメントがめっちゃ真面目で泣きそう
大損失だな……
それでは本日の出場者を紹介してまいります。
先ずは田中英行。
tanakhでお馴染みのアカウント名は、大学時代、フルネームだかtanakahだかの取得に、被ったか弾かれたかで妥協してつけたのがその由来です。
高校の時にファミコンだかスーファミだかのエミュレーションソフトをネットワーク対戦可能な機能をつけて開発した(当時ネットワーク対戦機能を持つエミュは世界初)人で
この時学んだだろう、ファミコンの処理の仕様には一家言あり。
京都大学工学部(後期日程で合格)卒、東大院卒
競技プログラミングでは全盛期にTopCoderにてレッドコーダーまで登ったことがあり、
大学時代に大学対抗競技プログラミングの世界大会へ国内代表権を勝ち取って出場歴あり、
その頃知り合ったエリート達と Preferred Infrastructure(PFI) を創業。
後に体調不良で休職しPFIを辞めた後、Haskellで株式を取り扱うソフトウェアを開発するベンチャー(?)に就職も半年強でまた転職。その転職先がPEZY Computingであります。
Twitterではふざけてばかりおりますが、あれは頭のいい人特有の余裕みたいなもので
本当の彼は日夜PEZYのスパコンで最高のパフォーマンスを叩き出して世界ランキングを塗り替えるべく
ループ毎に20ナノ秒を削るカリカリチューニングコードを書き続けている本物のプログラマです
社長の詐欺疑惑の件で社内の様子が新聞に載った際、『5000兆FLOPS欲しい!』のパロネタを壁に掲示していたのも彼の仕業であります
すごいHaskell楽しく学ぼうの翻訳者の一人
夢はこの世からプログラマ(という職を自動化技術によって)消し去ること
猫が大好き。Haskellマスター 田中英行──
プログラミングに関係ないプログラマの話は余所でやってほしい
競プロに出てくるような座標がコロコロ動いたり表を作るような問題をHaskellで上手く解くにはどうしたらいいでしょうか
手続き型では二次元配列を更新しまくればいいのですが
さすがに毎回takeとdropでリストを作り直すのは悪手ですよね?
悪手かどうかはコンパイラに聞いてみればいいんだろ
配列を更新しまくったらコンパイルエラーになるのか?
コンパイラが信用できないならLispとかErlangとかを使えばいい
関数型っぽく解決するにはどうすればいいかを聞いてるのでは
競技プログラミングと関数型プログラミングの両立を目指すのは良いと思うよ
ついでに手続き型と関数型も両立すればもっと良い
C++でギリギリな問題でもない限りMapとかでもいけるけど
Mapで書きやすいかというとそうでもない
少なくとも報道をソースとするなら、斎藤社長は「詐欺を働いた」に等しいのよ。
平たく言うと「自分の意思で嘘をついた」と言い換えてもいい。
それを、「開発の失敗」だの「誤りやミス」だのと一緒にしようとする
ぺジー連中が馬鹿だと言ってるのよ。
失敗やミスによるものと、虚偽によるものでは明らかに
社会や法のあつかいが異なる、そんなことも知らないのか、
知ってて敢えて誤魔化そうとしてんのかよぺジーのスパコン馬鹿は、って話。
>>363 Haskellと関係ない話だろ
>>354を読めない人か
>>367 あの情熱はぜひとも獲得したいと思っているのですが…
f = reverse . reverse
main = print $ f [1..10]
みたいに書いたときって、reverse関数が2回実行されますか?
結果が変わらないからされないですか?
そのままではされてしまいます。しかしメタプログラミングを用いて reverse . reverse を 静的に除去可能です
そういう除去って、reverseは逆順だっていう知識をアプリオリに与えておくの?
それとも定義から解析して無意味じゃんって判断できるの?
>>371 ありがとうございます
さすがに出来ないだろと思ってたんですが方法はあるのですね
プラグマはまだ明るくないのでもっと勉強します
foldl f a . reverse → foldr (flip f) a
みたいなルールはあってもいいかもね
reverse = foldl (flip (:)) [] だから
reverse . reverse == foldr (:) [] == id
後者の変換はghc標準でflipは簡約で消えると思う
pezyは嘘ついて補助金だまし取って、一部を私的に流用したから逮捕されたのに、
まるで開発が計画通り進まなかったから逮捕されたかのように
印象操作しているから悪質
べつに誰も何も言ってないだろ
おまいがそう解釈しただけでは
Haskell で開発されたアプリケーションのソースで、こういう形のものがある。
---[ Main.hs ]---
module Main where
import Application (runApp)
main :: IO ()
main = runApp
---[ Application.hs ]---
module Application (runApp) where
runApp :: IO ()
runApp = do
ほりゃらら
つまり、Main モジュールにはできるだけ何も書かず、別のモジュールに仕事を移譲している。
中には runApp 関数を一つ持つ Application クラスと、そのインスタンス型が一つだけ定義されている事もある。
このような実装の runApp 関数が実際に担っているロールはどれもアプリのエントリポイントだ。
しかし、これはまさに main 関数のロールではないだろうか。
main 関数が本来担う仕事を他の関数に丸投げする事にどのような意味やメリットがあるのだろうか。
>>380 runAppとは別の処理をrunAppの前後に入れるときにmainに書き足すだけで楽とかじゃね?
おれはmainに直接書くわ。Haskell以外でもそうしてる。
stackで新規プロジェクト作成するとmainからsomeFuncに飛んでるよね
Advent Calendar催促おばさんが面白い
>>380 runAppの処理を別のモジュールやアプリに組み込みたいとき、名前がmainだと困る、とか
>>382 楽かどうかという視点ならば、前後に入れるだけなら、
その手間は runApp 関数の中に入れるのと同程度ではないか?
別の処理だからという視点ならば、確かに一見理にかなっていそうたが、
アプリが立ち上がった直後、エントリポイントのロールよりも前に仕事をするものとは、
いったいどのようなロールなのだろう?
私が見てきたアプリでは、runApp 関数の中でコマンドライン解析や設定ファイルの読み込み、
ログシステムの構築なども行っていた。
要するにアプリを動かす準備だ。
準備をする前にすべき事とは?
>>387 runApp 関数内にそのアプリ専用のエントリポイントが書かれたものしか見たことがなく、
それを別のモジュールやアプリに組み込むという状況が想像できないのだが、
具体的にどういう事なのだろう?
その場合、関数名が main だとなぜ困るのだろう?
>>378 社員が総出でtwitterで開発が上手くいかなかったから詐欺にされたって
デマ流しまくっているじゃん
pythonにはxonshとかいうシェル言語があるらしい
http://vaaaaaanquish.hatenablog.com/entry/2017/11/30/175236 これのHaskellバージョンがあれば便利じゃないか。
Haskellとの親和性は高いと思う。シェルスクリプトって要はコマンドのコンビネータだし、コマンド呼び出しの構文は関数適用によく似てる。
ただ、ls -a -l -d hoobar みたいなのをシームレスに書くのはチャレンジングな課題だ。
引数の文字列リテラルのリストなどをコマンドラインにイチイチ打ち込むのは面倒くさい。
RebindableSyntaxでマイナスを定義し直して、、いや、悪手っぽいか。
なるべくHaskellを書いていきたい。いちばん身近なところを置き換えられたなら、とても良い。
haskellバージョンのイメージわかないけど
haskellシェルは何がどう便利になるというの?
pythonの真似だから便利さもpythonと同じになる計画なんだろ
同じにならなかったら、計画通りに行動しなかった奴が戦犯で、計画立てた奴は無罪
シェルスクリプトを使えばいいと思う
なぜコマンドの実行にHaskellを使う必要があるのか
まあconfigureスクリプトにはm4とかいうプリプロセッサがあるから意外と難しいよな
EzoeがいつHaskellに飽きて堂々とディスり始めるのか楽しみ
ガチC++erから見たHaskellというのに少し興味が湧いている
仕様壊れてるC++に慣らされきった人間にHaskellの厳格さの価値がわかるのかねぇ
静的型不要論的な妄言吐きそう
この人は本当にプログラム書けるのかと不安になることがあるよな。
はっきり言ってc++普及に関しては逆効果をあげてるとしか思えん。
ローカルマシンにある jenkins において、haskell コードのビルドに stack を使いたいのですが、
その際に環境変数として HOME が設定されていないと使えません。
そこで、ビルド時に使うシェルスクリプト内で HOME を JENKINS_HOME に設定しましたが、
このディレクトリでは何か問題あるでしょうか。
取りあえずやってみましたら、今のところ特に問題なくビルドできていますが・・・
スレチでしたらすみません。
>>406 jenkinsはわからないがstackはどうやら $HOME 直下に .stack ディレクトリを作って
そこに(必要なら)ghcとかをインストールするらしい。
例えばconfig.yamlもそこに入っているので、普段の$HOMEにそれがある場合は、jenkinsでのビルドと設定が変わってしまう。
とはいえ、このファイルが働くのは特定のプロジェクトに属さない動作のとき(stack newとか)だけっぽいので、
ディスクの容量が切迫してるとかでない限り、問題ないんじゃないかな。
C#しか知らない大学生なんだが関数型を理解したいんだが何すれば
は?勉強目的なら言語名でググって検索件数が多いやつのほうが解決策見つけやすいだろHaskell一択だろぉ
F#もいいけどまずはHaskellの純粋さに感動してからの方が良いよ
言語仕様はもちろんとして純粋関数型のデータ構造やアルゴリズムも合わせて学習しないと手詰まりになる
状態マシンでなく関数合成に持ち込む為の定番手法,
例えばiteratee?とかの知識も知りたい。
プラグマとかシンタックスシュガーのオプションがやたらあって、
古い構文がデフォルトでなくなったり、いまだに安定してないイメージが強い
拡張の数は標準の安定性と関係ないし非推奨になった構文も知る限り2,3個程度しかないし言うほど安定してなくはないと思うよ
主要な拡張の破壊的変更も多ければ不安定だがそこは知らん
安定してる言語の話題たまに出るけどどの言語もそれなりに不安定という結論以外になったとこ見たことない
そういや使用安定してるからで極地でCLが使われてたな
>>407 アドバイスありがとうございました。
参考にします。
再帰ってわかりにくくないですか?
実際によく使われているんですか?
扱うデータ構造が再帰的なら(連結リストとか木とか)
アルゴリズムも再帰の方が自然
初見だと脳のワーキングメモリをオーバーフローして拒絶反応を示すけど
慣れたら問題先送りにしちゃって尚且つ最後には解決しちゃう魔法みたいで気持ちいいよ
ループより再帰が好きだけどスタック気にしたりわざわざ末尾再帰にしなきゃいけなかったりするのは割とめんどい
breakとcontinueとreturnとthrowは関数ではない
関数ではないものを見るとマクロを書きたがるのがLisp
Haskellはマクロを使わない技術が発達したからなんでも関数を使う
HaskellはCのプリプロセッサ(俗に言うマクロ)を使えるのでは
エラーの原因を教えてほしいという奴にエラーの原因を教えないのがHaskellerか
また同様のエラーが出てもこのスレにくればコード書き直してやるよっていう優しさか
Windows10でstackのプロジェクトをbuildするとエラーが出てビルド出来ないお(´・ω・`)
While building custom Setup.hs for package ........
..
..
..
Process exited with code: ExitFailure 1
ボウヤは『windows10 haskell stack build error』でググるとかはしたのかい?
飢える者に魚を与えても一日しか救えない
釣りを教えれば一生救えるやもしれぬ
してみれば、
>>435は魚を与えたのじゃ
>>434 >>435 条件ミスってて全部otherwiseに行ってたのも直したらちゃんと動きました
ありがとうございます
>>438 Windowsで動かないパッケージ使ってるとか?
>>428 好き嫌いというか、ループはループ中で変数を操作するから値を返せるのであって、変数を言語から排除すれば自然にループも排除されるんじゃないの?
ループがあっても再帰が不要にはならない。でも再帰があればループ不要は本当の話。だからこそ変数を排除した言語があるんでしょ。
>>438 の原因はプロジェクトのパスに日本語が含まれているからでした...orz
haskellプログラミングできたンゴ
>>447 toBarの仕事はもっと少なくした方がいいよー
ソートとかは既存関数で手抜きしたけど、参考までに
https://ideone.com/fGFOEl stack の使い方について質問です。
stack new で作ったプロジェクトの package.yaml に executables と tests が設定されています。
その上で、tests のみのビルドあるいはビルド&実行を行うという事をしたいです。
しかしうまく行きません。
余計なものまでビルドされたり、実行されたりします。
executables には cmd-exe というターゲットがひとつ、tests には cmd-test というターゲットがひとつあるとします。
まず cmd-test のビルドだけを行いたく、stack build :cmd-test コマンドを実行してみました。
すると、cmd-exe と cmd-test がビルドされ、かつ cmd-test が実行されてしまいました。
今度は cmd-test のビルドと実行を行いたく、stack test :cmd-test コマンドを実行してみました。
すると、こちらも cmd-exe も一緒にビルドされてしまいました。
cmd-exe をビルドしないで cmd-test のみをビルドする方法、
そして cmd-test を実行しないでビルドのみを行う方法はあるでしょうか。
>>450 実行しないでビルドだけ行うのは --no-run-tests オプションを付けることで実現できましたが、
それでもまだ cmd-exe の方も同時にビルドされてしまいます。
普通の言語のできない数学者がプログラミングできるようにするための言語だ
彼らにはたやすい
デフォルト遅延評価に破壊的更新超苦手とかいうパフォーマンス的には冗談みたいな存在なのに
静的型付コンパイルというだけでVMアンチ勢から謎の期待を向けられる言語Haskell
この先haskellで良いGUIフレームワークって出ると思う?
>>456 現行のGUIフレームワークの問題点は何でしょうか?
>>459 >Haskellは遅延評価なので、リストを返す関数だからといって中間データとしてのリストを必ず作成する訳ではありませんから、
>結果を即座にfromListで書き込めば実質的に配列を出力する事が可能です。
ほんとぉ?
もう融合変換なんていらんやん
まあグラフ簡約がなかったらどうなるか実験した方がいいと思う
>>465 ほとんどの場合サンクを作るのは無駄だし最適化にも不利
haskellのコンパイルエラーメッセージが難解すぎる
>>468 問題があるのは10行目 return (shuffle (i - 1) flipped)
これの型は実際には、IO (IO [Int]) だが期待されているのは IO [Int] だ。
IO(などのモナド) に包むために使われる return はここでは不要。外すと IO [Int] になってコンパイル通る。
>>460 > おまえらってIDE何使ってるの?
>>73 あたりで同じ質問があった。VSCode, spacemacs が人気
>>455 この話をすると決まってStrict拡張を持ち出してくるのが痛いHaskellerの特徴だな
じゃあ最初から遅延評価なんかすんじゃねえよ
パフォーマンス的にはC/C++が王道だから素直にFFIを持ち出すのが王道
C/C++とFFIを無視するのは某言語の痛い特徴だよ
久々にHaskellで簡単なプログラム書いたんだけど
構造体使うだけでStateモナドもlensも必要になるあたりやっぱ欠陥言語だなこれ
最初から言語機能にいれとけや
>>466 その理屈だと遅延評価しない方は更に遅いじゃん。
クラスより構造体
メソッドよりフィールドが必要という常識を取り戻すだけで十年単位の時間がかかる
haskellでできることは他の言語だと難しくて
他の言語だと簡単なことはhaskellだと難しいという
スクリプト言語を許容できてHaskellをその性能から許容できないというのは理解できない感覚
感覚ではなく統計の取り方がそうなってるんだな
シェルスクリプトなんてプログラムのコンパイル時と起動前に実行するやつだから
起動するまで何分待たされてもベンチマークには関係ないから
型推論まわりを雰囲気で使っていました。
初等的なケースではそれでも問題なかったんですけど、
OVERLAPS とか type family とか出てきてから付いていけなくなりました。
助けてください。
https://ideone.com/XQ17ms 性能からって話はないな。
主にファイルIOやネットワークIOの気軽さの問題だと思うけど。
初心者だから適当だけどそこら辺はバンバンFFI使えばいいんじゃないのとか思ってしまう
そういうもんでもないのか
Stream Fusionの御利益を受けるには、
vectorパッケージでmapとかfoldみたいなので書けるところはすべて書いていく、
という方針でおけ?
>>488 そのサイト、人いないような… とりあえずありがとうです。
>>485 本質的にはこれと同じかな
https://ideone.com/hIoLnD undefinedは()にもなれるから失敗してるみたい?
>>485 横レスですが
(Hoo b ~ HooBar)
(b ~ Bar)
これのチルダってどういう意味なんですか(当方初心者です・・・)
haskell普及させたい言うわりには初心者に優しくない
どちらかというと初心者から中級者になるまでのミッシングリンクが上手く埋められてない
H本の次のレベルにふさわしいものがないと言ったほうがいいか
それhaskell以外の言語でもだいたいそうじゃね?
皆様ありがとうございました。勉強しました。
型推論の全体を概観する為に、以下の記事がわかりやすかったです。
http://yu-i9.hatenablog.com/entry/thih https://goo.gl/MH2cCx 型推論は、ざっくり 単一化 -> 帰結 の順に行われ、前者が頭部の具体化、後者は制約のチェックの役割になっているようです。
今回のケースで出たどのコードも単一化は通ってるんだけど、帰結の処理の際にエラーが出ていると思います。
>> 491 さんが単純化してくれたケースは、ご指摘の通り undefined がどちらのインスタンスにもなりうるため、"あいまいだ"という旨のエラーが出ていました。
これは例えば OVERLAPPING を INCOHERENT に置き換えると通ります。テキトウな順になるということです(OVERLAPSの解説は頂いた重城サンの記事(>> 492)が参考になりました)。
元の >> 485 のコードは型の属(type families)と等式制約が絡んだものです。
hoo :: ( 型制約 ) => 頭部
型制約中に現れるチルダは等式制約と呼ばれていて、これは type families が導入されたときに追加された文法らしい(>> 493)。
ざっくり言うと、Hoo b ~ HooBar は「型の関数 Hoo に型 b を適用したものが型 HooBar と等しくなる、という制約」を頭部に課します。
詳しくは
http://www.kotha.net/ghcguide_ja/7.6.2/equality-constraints.html 俺がコンパイラに期待したのは、 f :: (Hoo b ~ HooBar) => b の型シグニチャによって、b ~ Bar を類推することだったんですけど、どうもそれがうまく行っていない。
結局、帰結処理で type family や等式制約がどのように処理されるのかの資料は見つからなかったのですが、失敗する理由はわかりました。
この記事に答えがありました。
https://qiita.com/lotz/items/6c038698c8f04f57113a type instance Hoo Bar = HooBar だけでは、それ以外のインスタンス、例えば Hoo () などが HooBar とおなじになる可能性を排せないので、b を一意に決定することができないらしいんです。
型関数が単射であることをコンパイラに伝えれば解決です。言語拡張TypeFamilyDependencies を加え、
- type family Hoo b :: *
+ type family Hoo b = r | r -> b
と書き換えると、>> 485 のプログラムはコンパイルを通ります。
Haskellの型コンストラクタがいまいち理解できなかったけど、ラムダキューブでやっと理解できた。
ポリモーフィックな関数と所謂依存型とセットなんだね。
型コンストラクタとそいつで作られる型がオーバーロードできるのは、紛らわしい気がする。
>>494 何となく学習じゃあ、解決したい問題領域が曖昧なままだからな、何やっても難しく感じるよ。
もし依存型があったらリストの長さにより異なる型を使うね
でも遅延評価はリストの長さが有限でも無限でも同じ型にする
相性悪そう
hieとVSCode使ってるんだが、ドキュメントや入力候補が「読み込んでます」ってなって一向に読み込まれないんだが
お前らは問題なく使えてるの?っていうかどんな環境でやってる?
csacademyってコード貼り付けサイトして定着してんの?
Haskellの良いところは宣言的であることです。
宣言的であるということはCSSのように素人には使いこなせないということです。
素人には使いこなせなくすることでウェブデザイナーという奇妙な職業が生まれました。
同様にHaskellもハスケラーという新たな職業を生み出す可能性があります。
コードの質の下限が他の言語より高いなとは思う
例えばPHPなんかは、プログラマの能力によって質の良し悪しのギャップが非常に大きい
それに対してHaskellは、上を見たらキリがないが、下を見てもコンパイルエラーを起こさない時点である程度の質が担保されてる
その分覚えることが多いし、短期的な開発効率も下がりそうだけど、長い目で改修や保守を考えると悪くなさそう
>>509 PHPと比べてもしょうがないな…Javaあたりに読み替えといてください
> コードの質の下限が他の言語より高いなとは思う
>>133 入門書
入門書
入門書
:
Haskell 中級書出して
Haskell Wikibooksとか中上級くらいでないの?
「プログラミングHaskell」(Graham Hutton (著), 山本 和彦 (翻訳))
って入門者向け?
>>515 入門者向けには難しい
入門書を読み終えた初心者には物足りない
そんな本
ghci で
> let x :: (a ~ Int) => a;x = undefined
として実際の型をみると
> :t x
x :: Int
に変わっている。これはどういう仕組みによるもの?
引数が Show a だったらTrue, 違ったら False を返す関数
isShow :: a -> Bool
は可能ですか?
AdvancedOverlapは外でShowのインスタンスが増えた時に対応できないです。
isInstanceOf ! そういうのがあるんですか。調べてみます。
これを通して実現したい機能は、頭部ではなく型制約でオーバーロードしたいというもの。
具体的にはdiagramsパッケージの元で作ったダイアグラムを画像化したい。
同じ関数で Show a も画像化したい。
一見簡単そうなんですけど、普通に合成したダイアグラムの頭部に具体的な型がつかないので、
通常の型クラスのインスタンス化でオーバーロードできない。
instance Show a => Hoo a where ...
instance (a ~ Diagram B) => Hoo a where ...
-- コンパイルエラー!
すみません、
Huttonの「プログラミングHaskell」で
学習をしているのですが
練習問題の解答が
著者や役者のサイト等を見ても見当たらなく
もし掲載のページを知ってたら教えて下さい。
プログラミングHaskell 訳者によるサポートページ
http://www.mew.org/~kazu/doc/book/haskell.html
> 練習問題の答は、原著者のサポートページにあります。
>>524 すみません。
原著者のサポートページでは回答例を見つける事ができませんでした。
翻訳されていないの新版には回答例が掲載されているようですね。
コード例とかならここにあるみたいだけど
http://www.cs.nott.ac.uk/~pszgmh/book-old.html
>>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 のグラフ
https://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 の並び順番に気をつけてください。
-curl
lud20250124182520ncaこのスレへの固定リンク: http://5chb.net/r/tech/1506447188/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像
↓「関数型プログラミング言語Haskell Part31©2ch.net ->画像>6枚 」を見た人も見ています:
・【Microsoft】Excel関数ベースのプログラミング言語「Microsoft Power Fx」登場 オープンソースで公開予定 [少考さん★]
・【天才】スーパー中学生誕生、プログラミング言語わずか数週間で開発、U-22プログラミング・コンテスト2019
・【IT】プログラミング言語「COBOL」がTwitterトレンド入り AWS Lambdaのサポート言語に追加、技術者がざわつく
・プログラミング言語、Python一人勝ち。もうすぐ世界一人気のある言語に
・【朗報】今後プログラミング言語はJavaScriptの1強時代へ、これ以外の言語の学習は不要
・今から始める? 就職に有利なお勧めのプログラミング言語16選 [無断転載禁止]
・PHPもJavaScriptも難しくて挫折したんだけどもっと簡単なプログラミング言語ってないのかよ
・プログラミング言語「COBOL」がTwitterトレンド入り
・新型コロナウイルスの影響で「半世紀以上前のプログラミング言語の使い手」が急募される事態に
・【IT】Google、プログラミング言語「Go 2」開発計画発表 [無断転載禁止]
・【Lisp】プログラミング言語 Clojure #4【JVM】 [無断転載禁止]
・【Youtube】12月解禁のJのソロ曲「Who Are You? 」のMVが数日で43万回再生。SKEの最新シングルを1人で抜く。
・プログラミング演習「(1) 入力された値が素数か判定する関数をつくれ (2) 100以下の素数を出力するプログラムをつくれ」
・【テレ朝チャンネル】ワールドプロレスリング関連(クラシックス、完全版、ベスト5/他)
・【モーニング娘。'21 石田亜佑美】同期・佐藤優樹との関係&3年後の目標を告白!【アイドルもういっちょプラス】
・プログラミング業界に異変、SwiftとJavaが不人気、スマホアプリ開発までJavaScriptという時代に
・STU48、最新シングルが5作連続1位獲得 「デビューからシングル連続1位獲得作品数」で女性アーティスト歴代単独3位に
・一人で行く山木梨沙出演カレッジ・コスモス10/9発売2ndシングル発売記念ミニライブ&握手会 Part2【卒業式】
・【悲報】Intelの新型CPU「Skylake」シリコングリスバーガー症候群確定
・ソローモデル コブダグラス型生産関数
・ボクシング連盟前会長・山根明が芸能界進出へ 関西ローカル「胸いっぱいサミット!」に出演
・ボクシングヘビー級チャンピオン、ワイルダー「12kg差?関係ないよ」→防衛成功!一方日本人「1.3kgガ〜1.3kgガ〜」
・【NS/PC】人狼×和風伝奇ホラーADV「レイジングループ」,Switch版が8月3日から,PC版が複数ストアで8月上旬から下旬にかけて順次配信へ
・【芸能】橋本環奈、ソロデビューシングル「セーラー服と機関銃」ジャケット3タイプ初公開 [無断転載禁止]
・シングルマザー半数が収入減「すぐ現金給付を」 新型コロナ影響くっきり
・■ ハロプロ総出演 ■ ひかりTV 『【独占生中継】Hello! Projectひなフェス2020モーニング娘。'20 プレミアム』 ■ 14:45〜16:45■C
・【五輪】ミッツ・マングローブ、吉田沙保里選手の涙に「シラけた」発言を謝罪「申し訳ありませんでした」★2 [無断転載禁止]
・【衝撃】ポリネシア・トライアングルで“宇宙人”が崇拝されていた!? グレイやレプティリアンに激似の石像多数発見![03/13] ©bbspink.com
・【お酒】狂気!ついに「アルコール度数12%」のストロング過ぎるチューハイが爆誕!ローソンとポプラで限定発売★3
・江川紹子氏、モーニングショーで文句ばっかり言ってる青木理に「いつも外野でわーわー言うだけ」 ネット「内ゲバか?w」 [Felis silvestris catus★]
・プログラミング学習を始めるにあたって 数学の行列のところとかの知識が必要だというので 今日は映画の待ち時間の間に
・【ボクシング】村田 笑顔の会見一転…挑戦者WBA世界ミドル級2位ロブ・ブラント(27=米国)24戦23勝(26KО)1敗の話には怒りモード
・ライフカード、半数以上のメンバーがVプリカプレゼントに応募者なしだった不人気16期生で無謀な商売を性懲りもなくする
・【快挙】PINK CRES.初シングル オリコンランキング初動、堂々の13位キタ━━━━(゚∀゚)━━━━ッ!!
・乃木坂46さん、白石麻衣卒業シングルで全くヒットしないどころか近年最低のMV再生数&DL数&ストリーミング数にwwwww
・【週刊新潮】 ボクシング協会・山根明 「昔は差別がいっぱいあった。朝鮮人、朝鮮人って言われた。日本に帰化してから40年近くになる」
・【音楽】竹内まりやのRCA時代5作品がAppleMusic他でストリーミング配信開始!いやいやプラスティックラブは聴けないのかよ…
・【IT】ディープラーニング初心者向けの日本語学習サイト、PFNが無償公開
・15年アイドルやってきてラストシングル発売なのに全くテレビ出演ゼロのカントリーガールズ嗣永桃子さん [無断転載禁止]
・【ボクシング】井上尚弥、全階級最強ランク4位浮上! 米リング誌PFPで自己最高、ゴロフキンら抜く
・【朗報】2月6日発売IZ*ONE 1stシングル『好きと言わせたい』個別ハイタッチ会の完売部数で宮脇咲良さんがトップに!
・本店の56thシングルまだか?って言ってる人いるが次はタイミング的にシングルじゃなくアルバムだろ?
・関数型言語一般 [無断転載禁止]
・【ハロプロ最大】Juice=Juiceのドーピングが凄まじい件・・・握手会35回(内ミニライブ24回)、個別7日・・・
・【ミラクロ】ミラーズクロッシング Part3
・関西生コン SEALDs シバキ隊 ANTIFA 弘道
・【サッカー】EL準々決勝第2戦 マルセイユ×ライプツィヒ、CSKA×アーセナル、スポルティング×アトレティコ、ザルツブルク×ラツィオ
・モーニング娘。春ツアー開催期間中のwikipedia閲覧数ランキング出たよー
・【ボクシング】王者・山中竜也“完璧”前日計量、挑戦者カジェロスは全裸でヒヤリも「ノー、ネリ!」[18/03/18]
・・ラストアイドルの最新シングル「大人サバイバー」が、初週7.3万枚を売り上げ、4/29付オリコン週間シングルランキングで初登場1位
・【ボクシング】WBAライトフライ級チャンピオンの田口良一が防衛戦、京口紘人がIBFミニマム級世界初挑戦、7月にW世界戦 [無断転載禁止]
・乃木坂西野ラストシングル「遠回りしたい帰り道がある」MVの再生回数が伸びないwww
・【スマホ】防水とFeliCaに対応、小型のフラグシップスマホ「Zenfone 8」が登場 約8万円から【おサイフ・防水防塵・SD888】 [エリオット★]
・【AMD】Ryzenの3DMARK FireStrike Physicsスコアがリーク [email protected]と[email protected]が同等 シングル性能はBroadwellと同等
・A.B.C-Z★267stars★ 3/27(水)6thシングル「Black Sugar」発売 ※3/29MステSP・バズリズム出演
・【ビルボード】Snow Man『KISSIN' MY LIPS / Stories』初週93.9万枚で堂々シングル1位 [湛然★]
・FF・キングダムハーツのスクエニ橋本がダイレクトをRT!シリーズ関連作品発表か
・【社会】大学新テストに「プログラミング」検討 IT人材育成
・【朗報】AKB48 54th『NO WAY MAN』の公開24時間YouTube再生数が乃木坂46が今年発売した全シングルに圧勝する快挙を達成!
・SixTONES最新シングルが初登場1位、週間60万枚超えを記録【オリコンランキング】 NGT48は?
・ももクロがKISSとコラボでシングル発売、3月3日に東京ドームで合同コンサートwwwwwwwwwwwwwwwwwwww
・【ボクシング】「数年前ならドネアがKOしていた」 井上尚弥をウーバーリが挑発「俺が勝つだろう」
・テスラ スーパーレーシング Tesla Super Racing
・羽鳥モーニングショー、視聴率10%割れでコロナバブル崩壊… ネット「デマばっかり撒き散らして日本を貶める番組。打ち切りに… [Felis silvestris catus★]
・【ミラクロ】ミラーズクロッシング Part2
・【ゴキ爺は】プロレスリング・ノア総合スレPART36【出禁】
04:25:20 up 11 days, 5:28, 2 users, load average: 8.46, 8.31, 8.71
in 1.8564209938049 sec
@0.082916975021362@0b7 on 012418
|