関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
https://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part30
http://mevius.2ch.net/test/read.cgi/tech/1484491434/
関数型プログラミング言語Haskell Part31©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/09/27(水) 02:33:08.70ID:2XAqPuH2
2017/10/15(日) 23:23:28.47ID:E5HePsK2
使う意味がわからない
局所的なスコープの中だから式でないと書けないでもなければ使わない
局所的なスコープの中だから式でないと書けないでもなければ使わない
2017/10/15(日) 23:33:15.58ID:c/qV5Afw
>>66
いいこときいた!
いいこときいた!
2017/10/16(月) 00:02:00.30ID:TY5gTDK1
値ならlet、関数ならwhereみたいな使い分けしてるわ
両方混ざることもしばしば
caseもdo構文の中とかで普通に使わね?
両方混ざることもしばしば
caseもdo構文の中とかで普通に使わね?
2017/10/16(月) 03:01:45.14ID:Nb+0WxCX
左上から順番に読んで引っかかる時はlet使うかな。パターンガードはwhere一択だね。
baseパッケージを雑に調べたんだけど、総数はそれぞれ
where: 2038
let: 665
case: 979
baseパッケージを雑に調べたんだけど、総数はそれぞれ
where: 2038
let: 665
case: 979
2017/10/16(月) 18:36:49.72ID:oTRCGw1x
そして余計な宗教戦争へ発展
2017/10/16(月) 21:17:09.38ID:UKE6NQTo
foo = \ n -> let xs = map fib [0 ..] in xs !! n
bar = let xs = map fib [0 ..] in \ n -> xs !! n
宗教はいくつか掛け持ちする方がいい
nonlocalにすればlifetimeが長いとか便利な言葉が使える
bar = let xs = map fib [0 ..] in \ n -> xs !! n
宗教はいくつか掛け持ちする方がいい
nonlocalにすればlifetimeが長いとか便利な言葉が使える
2017/10/16(月) 21:45:30.25ID:Nb+0WxCX
宗教で思い出したんだけど、みんなエディタは何使ってる?
https://github.com/rainbyte/haskell-ide-chart
Atom派が増えてきた気がする(Stepwise Debuggerってなんだろう)。
https://github.com/rainbyte/haskell-ide-chart
Atom派が増えてきた気がする(Stepwise Debuggerってなんだろう)。
2017/10/16(月) 23:03:58.10ID:wsZRBdk3
vscode+hie
2017/10/16(月) 23:06:05.01ID:1r/tGA5g
vscodeいいよな
他の言語でも大活躍
他の言語でも大活躍
2017/10/16(月) 23:09:52.45ID:wsZRBdk3
vimのlanguage server対応がもっと進んだらvimに戻りたい
2017/10/16(月) 23:13:43.26ID:RTfo5Gm3
https://wiki.haskell.org/Let_vs._Where#Problems_with_where
これ前者はクロージャみたいなものということなのかな
これ前者はクロージャみたいなものということなのかな
2017/10/17(火) 01:54:05.70ID:kmqw2VEi
spacemacs + intero
2017/10/17(火) 06:46:01.60ID:X7yOqbnN
HIE知らんかった。試してみよう。
自分もSpacemacsだわ。
自分もSpacemacsだわ。
2017/10/17(火) 08:53:48.72ID:NQL+y7y0
プログラミングに限らず、およそ文字列を編集する作業において、
vim以外のエディタは考えられない体になってしまった。
vim以外のエディタは考えられない体になってしまった。
2017/10/17(火) 10:17:04.48ID:1Byit6P4
vscodeはvimがクソなのがな
2017/10/17(火) 20:53:20.25ID:FkVJ0QE/
タイプミスが多いのでキー入力コマンド操作とか誤操作ばかりで死ぬ
2017/10/17(火) 21:34:05.58ID:lwYxKvg3
CoqとかAgdaもやろうとしてたからEmacs一択で、
Vimの操作性も習得したいと思ってたから結果的にSpacemacsに落ち着いたわ。
Vimの操作性も習得したいと思ってたから結果的にSpacemacsに落ち着いたわ。
2017/10/17(火) 21:45:06.92ID:dWslrgIK
Spacemacs知れようとして、Emacsのバージョン足りなくて死んだ
2017/10/17(火) 21:48:15.65ID:kmqw2VEi
静的どころか参照透明なんだし、補完は充実してほしいよなあ。
data Pen = Pineapple | Apple
apple = Apple
pen :: Pen
pen = a
もうこの時点で候補をappleに絞ってほしい。
data Pen = Pineapple | Apple
apple = Apple
pen :: Pen
pen = a
もうこの時点で候補をappleに絞ってほしい。
2017/10/17(火) 22:31:12.09ID:Is39GLXq
異教徒間の鍔迫り合いが始まる予感です?
2017/10/17(火) 22:46:49.54ID:bTvRRU/M
そんな「絞り込み」はそもそもできないしすべきでもない
そもそもその例の場合なら完全に redundant だとしてむしろ積極的にappleを除外してほしい
そもそもその例の場合なら完全に redundant だとしてむしろ積極的にappleを除外してほしい
2017/10/17(火) 22:58:58.88ID:kmqw2VEi
2017/10/17(火) 22:58:59.79ID:IqfDhIHj
2017/10/17(火) 23:07:03.82ID:kmqw2VEi
2017/10/17(火) 23:16:36.80ID:bTvRRU/M
id やら const やらの問題はさておき
そこでもし仮に apple に絞られたら相当イラつく
そこでもし仮に apple に絞られたら相当イラつく
2017/10/17(火) 23:25:06.39ID:IqfDhIHj
>>88
その例なら簡単にできるけど、一般的には相当厳しいと思うよ。
型がシノニムだったら、辿って元の型を探さないといけないね。
import されてたら、それも全て辿らないといけないね。
template が使われてたら、展開しないといけないね。
Cプリプロセッサが使われてたら、これも展開しないといけないね。
型を決定するのに関わる事は他にもいっぱいある (言語拡張とか)。
あと、参照透明は破られないという前提で話してると思うけど、
unsafePerformIO 関数があることを忘れないように。
その例なら簡単にできるけど、一般的には相当厳しいと思うよ。
型がシノニムだったら、辿って元の型を探さないといけないね。
import されてたら、それも全て辿らないといけないね。
template が使われてたら、展開しないといけないね。
Cプリプロセッサが使われてたら、これも展開しないといけないね。
型を決定するのに関わる事は他にもいっぱいある (言語拡張とか)。
あと、参照透明は破られないという前提で話してると思うけど、
unsafePerformIO 関数があることを忘れないように。
2017/10/18(水) 11:52:10.17ID:LmQIn2MI
まずは自動車を二人で運転したり、独裁者が二人いる国を作ってみればいいのだ
それができたら一人を機械で置き換えて人間+機械のコンビを作る
それができたら一人を機械で置き換えて人間+機械のコンビを作る
2017/10/18(水) 22:09:24.34ID:XAtaZZJd
Haskellでウェブアプリ作れますか?
2017/10/18(水) 22:40:49.32ID:CCDizLJ7
2017/10/18(水) 23:03:06.30ID:449CvZ10
webフレームワーク周りは一時期乱立とは言わないまでもだいぶ混乱してた印象があるけど
最近の流れはどうなってるんだろうか
最近の流れはどうなってるんだろうか
97デフォルトの名無しさん
2017/10/18(水) 23:44:26.71ID:gezDC8oz すみません、ある型とその取扱い関数の
標準・追加ライブラリでの有無の確認なのですが、
実数の範囲を表す型で(A,B)というのがあったとして
A以上B未満の範囲を示していて、
それがリストに[ s1, s2, s3, s4 ]の様に並べられているとして
その中身は[(0,1),(1,2),(2,4),(4,8)]としますと
実数「1.5」はこのリスト3番目の変数が示す範囲に
含まれますと教えてくれる関数なのですが、
このような型と関数があるライブラリを知っていましたら
教えて下さい。
標準・追加ライブラリでの有無の確認なのですが、
実数の範囲を表す型で(A,B)というのがあったとして
A以上B未満の範囲を示していて、
それがリストに[ s1, s2, s3, s4 ]の様に並べられているとして
その中身は[(0,1),(1,2),(2,4),(4,8)]としますと
実数「1.5」はこのリスト3番目の変数が示す範囲に
含まれますと教えてくれる関数なのですが、
このような型と関数があるライブラリを知っていましたら
教えて下さい。
2017/10/18(水) 23:47:55.99ID:gezDC8oz
すみません。
「リスト2番目」の間違いでした。
「リスト2番目」の間違いでした。
2017/10/18(水) 23:54:52.59ID:JBC50Xi/
Yesodの辛さを述べた記事を最近みた。
100デフォルトの名無しさん
2017/10/19(木) 00:31:32.35ID:IrC75yTx 最近なら servant が多いんじゃないか?
101デフォルトの名無しさん
2017/10/19(木) 00:42:33.76ID:IrC75yTx >>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
ライブラリ探す暇があったら自分で書いたほうが早いだろ
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
102デフォルトの名無しさん
2017/10/19(木) 00:55:37.69ID:a0gJXcH3103デフォルトの名無しさん
2017/10/19(木) 02:16:33.94ID:CTOkinld まだイェソドが最強なのですか?
104デフォルトの名無しさん
2017/10/19(木) 07:52:00.67ID:NmeCWEht イェソドってセフィロトの樹と何か関係あるの?
105デフォルトの名無しさん
2017/10/19(木) 11:32:05.27ID:yTKuENfR 辞書ファイルから欲しいデータを抜くのに使ってるけど、
Haskellだとライブラリ使うというより、
スクラッチで欲しい関数を書けるのが良いね。
調べるより作った方が早いし細かい調整がきく。
Haskellだとライブラリ使うというより、
スクラッチで欲しい関数を書けるのが良いね。
調べるより作った方が早いし細かい調整がきく。
106デフォルトの名無しさん
2017/10/19(木) 15:41:04.63ID:a0gJXcH3107デフォルトの名無しさん
2017/10/19(木) 18:16:54.99ID:XElZhSKt >Haskellだとライブラリ使うというより、
>スクラッチで欲しい関数を書けるのが良いね。
> 調べるより作った方が早いし細かい調整がきく
小さいパーツ程度ならね
>スクラッチで欲しい関数を書けるのが良いね。
> 調べるより作った方が早いし細かい調整がきく
小さいパーツ程度ならね
108デフォルトの名無しさん
2017/10/19(木) 18:41:26.50ID:TgxB2ED8 >穴の空いたトランポリンで跳ね回れ
いいなこれ。今度から使わせてもらうわ
いいなこれ。今度から使わせてもらうわ
109デフォルトの名無しさん
2017/10/19(木) 20:44:43.20ID:C59kUjZF >>106
それは分かってる。
その意見には俺も全面的に賛成だよ。
ただ、やろうと思えばできてしまうんだよ。
例えばコマンドラインパーサーの CmdArgs パッケージでは unsafePerfirmIO が使われてる。
(なかなか使い勝手が良いライブラリなのに玉に瑕で残念)
だから、参照透明が保たれているという前提で補完機能を作るわけにはいかない。
それは分かってる。
その意見には俺も全面的に賛成だよ。
ただ、やろうと思えばできてしまうんだよ。
例えばコマンドラインパーサーの CmdArgs パッケージでは unsafePerfirmIO が使われてる。
(なかなか使い勝手が良いライブラリなのに玉に瑕で残念)
だから、参照透明が保たれているという前提で補完機能を作るわけにはいかない。
110デフォルトの名無しさん
2017/10/19(木) 21:28:00.48ID:a0gJXcH3 一般的には透明性が保たれてるならunsafeを使っても大丈夫だよね。
FFIでCのライブラリを使って値を取ってくる時に、引数で返り値が一意に決まるならば、必ずしもIOで包まなくてもいい。
補完システムでは、プログラミング中に値を得ることを考えてるので、制限はもっと厳しい。
悪意のある誰かがコード中にunsafePerformIOでディスクを皿にするコードを入れていたとする。
現状では実行しなければ問題ないけど、その補完システムではエディタに読み込んだ時点で… ふっ飛ぶ!
アドバイスは的を得ていると思う。指摘を受けて、SafeHaskellでのみリッチな補完が出来る。という回避を考えているよ。
FFIでCのライブラリを使って値を取ってくる時に、引数で返り値が一意に決まるならば、必ずしもIOで包まなくてもいい。
補完システムでは、プログラミング中に値を得ることを考えてるので、制限はもっと厳しい。
悪意のある誰かがコード中にunsafePerformIOでディスクを皿にするコードを入れていたとする。
現状では実行しなければ問題ないけど、その補完システムではエディタに読み込んだ時点で… ふっ飛ぶ!
アドバイスは的を得ていると思う。指摘を受けて、SafeHaskellでのみリッチな補完が出来る。という回避を考えているよ。
111デフォルトの名無しさん
2017/10/19(木) 21:31:47.78ID:a0gJXcH3 >>109 CmdArgs パッケージは、初見だけど… うーん。なぜこんな風になってるんだろう。
IOにするわけにはいかんのだろうか?
IOにするわけにはいかんのだろうか?
112デフォルトの名無しさん
2017/10/19(木) 21:38:26.29ID:IrC75yTx Haskell使ったプロダクションコードにしばしばあるやつね
環境変数みたいなのは Reader で引き回すよりさっくり
unsafePerformIO でアレするのがアレでね
環境変数みたいなのは Reader で引き回すよりさっくり
unsafePerformIO でアレするのがアレでね
113デフォルトの名無しさん
2017/10/19(木) 21:41:05.61ID:a0gJXcH3 だいたい判った。この用途では仕方ない。
114デフォルトの名無しさん
2017/10/19(木) 21:42:06.30ID:IrC75yTx115デフォルトの名無しさん
2017/10/19(木) 21:51:43.24ID:TgxB2ED8 unsafePerformIO取締法違反でタイポする!
116デフォルトの名無しさん
2017/10/19(木) 22:14:05.51ID:n4u77snN コンパイラがしゃべった!?って、ただの腹話術か
いっつも腹話術してるな
いっつも腹話術してるな
117デフォルトの名無しさん
2017/10/19(木) 23:17:00.35ID:55bDTs5O あれ?評価が、遅れて、されるよ?
119デフォルトの名無しさん
2017/10/20(金) 09:50:03.15ID:Bz70yab6 >>112
そんな事すると、何のために Haskell を使ってるのか分からん
そんな事すると、何のために Haskell を使ってるのか分からん
120デフォルトの名無しさん
2017/10/20(金) 11:11:48.75ID:zpEeQZDE じゃあ「分かるHaskell」と「分からんHaskell」の両方を使いこなせばいいよ
そういう多様性を何のために肯定するのかっていうと
未知の新しい言語を見た瞬間に使いこなすための練習だと思えばいいんじゃないか
そういう多様性を何のために肯定するのかっていうと
未知の新しい言語を見た瞬間に使いこなすための練習だと思えばいいんじゃないか
121デフォルトの名無しさん
2017/10/20(金) 13:24:48.13ID:f6ubOuco122デフォルトの名無しさん
2017/10/20(金) 13:41:07.05ID:Lk8bVHte まあ、プロダクションだとやっぱり時折 unsafe 唱えるわけだけど
どういうときに唱えても已むを得ないかの知識が秘伝のタレ化してる感はある
どういうときに唱えても已むを得ないかの知識が秘伝のタレ化してる感はある
123デフォルトの名無しさん
2017/10/20(金) 17:24:25.31ID:zpEeQZDE x = unsafePerformIO m
main = do {
safe_x <- return $! x;
...
}
これで無難な値を無難なタイミングで取り出せる
ただし、mainを2回実行したらmは何回実行されるべきかの知識が秘伝
main = do {
safe_x <- return $! x;
...
}
これで無難な値を無難なタイミングで取り出せる
ただし、mainを2回実行したらmは何回実行されるべきかの知識が秘伝
124デフォルトの名無しさん
2017/10/20(金) 17:32:08.06ID:GdkUB6y1 unsafe* を使用する際は逐一稟議を通すこと
125デフォルトの名無しさん
2017/10/20(金) 17:57:47.07ID:gxUn2vL9 unsafeReadとunsafeWriteの詳しい説明や使い方がわかる書籍やサイトがあれば教えてください
126デフォルトの名無しさん
2017/10/20(金) 18:14:08.30ID:Vljj85av グローバル定数とみなせる値を取得したい + 使う場所がMonadIOでない + 設計変更の時間はない
127デフォルトの名無しさん
2017/10/20(金) 18:38:52.46ID:zpEeQZDE 使用したいというより読みたいんだよ
ありのままの現実を読む主義
現実を操作するつもりはない
ありのままの現実を読む主義
現実を操作するつもりはない
128デフォルトの名無しさん
2017/10/20(金) 22:15:19.17ID:YXH4kbKq Haskellやったら特別になれるの?
129デフォルトの名無しさん
2017/10/20(金) 22:37:34.15ID:rG34NDiA 疎外感を味わえます
130デフォルトの名無しさん
2017/10/20(金) 23:04:24.26ID:Vljj85av そうならなくて済むよう、普及にもう少し力を入れる必要があるよね。
何があれば賑わうかって考えたんだけど、やっぱりもっと和書が必要ではないか。
「Haskellでゲームを作る本」とか「Haskellで解る圏論入門」とかどうだろう。
何があれば賑わうかって考えたんだけど、やっぱりもっと和書が必要ではないか。
「Haskellでゲームを作る本」とか「Haskellで解る圏論入門」とかどうだろう。
131デフォルトの名無しさん
2017/10/20(金) 23:22:26.18ID:ut8tKZ1b Haskellなら三ヶ月後、自分で書いたコードを読めます
132デフォルトの名無しさん
2017/10/21(土) 00:05:14.21ID:yOthW/dM >>131
そんな楽観はできない。
3ヶ月後も読めるようにするには、それなりのコードを書かなければならない。
Haskellなら自然にそういうコードになる、なんてことは全くないよ。
1つの関数に複数の仕事をさせてしまったり、
let節やwhere節で計算のフローを書いて関数を肥大化させてしまったり、
逆に一行に押さえようとポイントフリーをやりすぎて暗号化してしまったり、
仮引数の名前を短くしすぎて役割が分からなくなってしまったり、
モナド変換子のスタックをややこしくしてしまったり。
意識していないと陥りやすい罠は幾らでもある。
そんな楽観はできない。
3ヶ月後も読めるようにするには、それなりのコードを書かなければならない。
Haskellなら自然にそういうコードになる、なんてことは全くないよ。
1つの関数に複数の仕事をさせてしまったり、
let節やwhere節で計算のフローを書いて関数を肥大化させてしまったり、
逆に一行に押さえようとポイントフリーをやりすぎて暗号化してしまったり、
仮引数の名前を短くしすぎて役割が分からなくなってしまったり、
モナド変換子のスタックをややこしくしてしまったり。
意識していないと陥りやすい罠は幾らでもある。
133デフォルトの名無しさん
2017/10/21(土) 00:23:56.54ID:4Fwr4eN0134デフォルトの名無しさん
2017/10/21(土) 00:58:52.37ID:Sgt31MqE >>132
いや、131は揶揄・皮肉だと思う。何スレか前にあった俗説「Haskellでは3ヶ月前に書いた自分のコードが読めなくなる」に対しての。
理由は確か、Haskellでは習熟するにつれてコードが全然違ってくるから、だったかな。
未熟だった頃の考え方とかをスッカリ忘れてしまうので、読んでも頭に入ってこない。
133のコードから漂う、Java上がり臭… 真面目に書いたのも見て取れるんだけど、標準の関数や表記法とズレているのでどうにも読みにくい。
いまstackのコードを読んでるんだけど、意図してコードのレベルを抑えてるフシがある。const を使わずに \_->... と書いてたり。
練度の高低でコードが違ってくることはある意味で良いことといえるのかもしれないけど、多人数で使う際には難しさがあるようだ。
いや、131は揶揄・皮肉だと思う。何スレか前にあった俗説「Haskellでは3ヶ月前に書いた自分のコードが読めなくなる」に対しての。
理由は確か、Haskellでは習熟するにつれてコードが全然違ってくるから、だったかな。
未熟だった頃の考え方とかをスッカリ忘れてしまうので、読んでも頭に入ってこない。
133のコードから漂う、Java上がり臭… 真面目に書いたのも見て取れるんだけど、標準の関数や表記法とズレているのでどうにも読みにくい。
いまstackのコードを読んでるんだけど、意図してコードのレベルを抑えてるフシがある。const を使わずに \_->... と書いてたり。
練度の高低でコードが違ってくることはある意味で良いことといえるのかもしれないけど、多人数で使う際には難しさがあるようだ。
135デフォルトの名無しさん
2017/10/21(土) 01:24:40.12ID:E5Mq7+kB https://ideone.com/q2RCBe
これは >>133 のほぼ 1/10 の行数で書かれている
solve = build “” “”
という行を見て
「ああアキュムレータが2つあるのね」
とわかるのであとはそのまま読むだけ
これは >>133 のほぼ 1/10 の行数で書かれている
solve = build “” “”
という行を見て
「ああアキュムレータが2つあるのね」
とわかるのであとはそのまま読むだけ
136デフォルトの名無しさん
2017/10/21(土) 01:35:46.03ID:E5Mq7+kB というか、>>133 のコードはこれはネタでわざとやってるな
137デフォルトの名無しさん
2017/10/21(土) 04:25:54.74ID:Sgt31MqE うひょーッ iOS & Android の ghc バイナリが来た!
http://hackage.mobilehaskell.org/
解説ページ
https://medium.com/@zw3rk/ghc-cross-compiler-binary-distributions-490bb2c0c411
http://hackage.mobilehaskell.org/
解説ページ
https://medium.com/@zw3rk/ghc-cross-compiler-binary-distributions-490bb2c0c411
138デフォルトの名無しさん
2017/10/21(土) 06:39:56.81ID:M5O/aj/a 何が始まるんです?
139デフォルトの名無しさん
2017/10/21(土) 12:52:45.37ID:JKqQJ+2p 自分で書いたコードが、他人が書いたコードと同じに見える
これは普通
同じ書き方をしない方が異常
3ヵ月前の時点ですでに他人が書いたコードと同じに見えていい
これは普通
同じ書き方をしない方が異常
3ヵ月前の時点ですでに他人が書いたコードと同じに見えていい
140デフォルトの名無しさん
2017/10/21(土) 17:28:30.51ID:lv/AbapF141デフォルトの名無しさん
2017/10/21(土) 21:05:29.77ID:sahtjmhq >>124
稟議のロジックをHaskellで書いてくれ。
稟議のロジックをHaskellで書いてくれ。
2017/10/22(日) 09:33:44.39ID:IsEvYiKq
アキュムレータのように引数で変数束縛するのはprologっぽい書き方
haskellならアキュムレータの代わりにwhereを使う手がある
makeMaximumSizeAndMinimumOrderPalindrome wordlist = xs ++ [y] ++ zs where ...
haskellならアキュムレータの代わりにwhereを使う手がある
makeMaximumSizeAndMinimumOrderPalindrome wordlist = xs ++ [y] ++ zs where ...
2017/10/22(日) 14:42:07.09ID:b60KFBOe
Intellij IDEAのIntellij-Haskellプラグインが上手く実行できなくて諦めかけてたけど改めて挑戦したらやっとできた
これで俺もIDEデビューだ
開発効率上がるといいな
これで俺もIDEデビューだ
開発効率上がるといいな
2017/10/22(日) 15:26:27.37ID:mN+j7loz
アキュムレータの意味がわかってないキチガイがいるのか……
145デフォルトの名無しさん
2017/10/26(木) 22:30:22.73ID:/i1iouMm ByteStringについて、↓の記事に
「使い方の結論を述べると、入力には正格 ByteString、出力は遅延 ByteString を用います」
と書いてあるのですがそうなんですか?
だとしたらなぜそうなるのか教えていただけますでしょうか
http://d.hatena.ne.jp/kazu-yamamoto/touch/20110525/1306298046
「使い方の結論を述べると、入力には正格 ByteString、出力は遅延 ByteString を用います」
と書いてあるのですがそうなんですか?
だとしたらなぜそうなるのか教えていただけますでしょうか
http://d.hatena.ne.jp/kazu-yamamoto/touch/20110525/1306298046
146デフォルトの名無しさん
2017/10/27(金) 19:45:49.01ID:is9IZ5oJ147デフォルトの名無しさん
2017/10/28(土) 17:22:18.77ID:sV/HPdac 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)
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)
148デフォルトの名無しさん
2017/10/28(土) 17:23:34.06ID:sV/HPdac > 入力には正格 ByteString、出力は遅延 ByteString
これ俺も疑問に思ってた
これ俺も疑問に思ってた
149デフォルトの名無しさん
2017/10/28(土) 17:37:14.16ID:vt4jCtcJ 実装上の都合です
理論的には何の根拠もございません
理論的には何の根拠もございません
150デフォルトの名無しさん
2017/10/28(土) 17:45:11.92ID:zE41SC6F メモリ的には入力遅延のほうがよさそうだけどハンドルをすぐ解放するために正格ということかな
151デフォルトの名無しさん
2017/10/28(土) 19:05:35.06ID:nHlzoa71152デフォルトの名無しさん
2017/10/28(土) 20:19:14.51ID:zE41SC6F どの本だっけ、Real World?
153デフォルトの名無しさん
2017/10/28(土) 20:46:38.08ID:DenCC8QE 出典はHaskell High Performance Programmingです
154デフォルトの名無しさん
2017/10/28(土) 21:00:26.16ID:zE41SC6F それか
読みたいと思ってたんだよなそれ
邦訳はよ
読みたいと思ってたんだよなそれ
邦訳はよ
155デフォルトの名無しさん
2017/10/29(日) 00:46:23.62ID:UfAXS2oV >>151
正格ByteStringが遅延に買ってる部分ないのか
正格ByteStringが遅延に買ってる部分ないのか
156デフォルトの名無しさん
2017/10/29(日) 07:47:46.53ID:U58o7DSK 普通に配列とリストの違い
ただしリストの要素は32kの配列
ただしリストの要素は32kの配列
157デフォルトの名無しさん
2017/10/29(日) 09:00:08.15ID:vzk3gwxY WAI の実装とかそういう凄え特殊な場面での話だろうな
リソース管理が死活の場面では Lazy IO がワリと死ねるので
でもそういうのはいまなら各種の streaming ライブラリでOK
リソース管理が死活の場面では Lazy IO がワリと死ねるので
でもそういうのはいまなら各種の streaming ライブラリでOK
158デフォルトの名無しさん
2017/10/29(日) 22:14:12.00ID:HYvWAe4Y 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 の方がメモリ効率がいいのか分からん。
どっちも結果の値が評価されるまで式が数珠繋ぎになったままじゃね?
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 の方がメモリ効率がいいのか分からん。
どっちも結果の値が評価されるまで式が数珠繋ぎになったままじゃね?
159デフォルトの名無しさん
2017/10/29(日) 22:32:56.88ID:SX8DMS20 これ?
Haskell の畳み込み関数 - foldl, foldr | すぐに忘れる脳みそのためのメモ
http://jutememo.blogspot.jp/2008/06/haskell-foldl-foldr.html
Haskell の畳み込み関数 - foldl, foldr | すぐに忘れる脳みそのためのメモ
http://jutememo.blogspot.jp/2008/06/haskell-foldl-foldr.html
160デフォルトの名無しさん
2017/10/30(月) 00:11:55.76ID:kEApsxXD 競プロでhaskell使う場合の何かアドバイスください
この問題解けませんでした
https://yukicoder.me/problems/no/583
https://yukicoder.me/submissions/212458
この問題解けませんでした
https://yukicoder.me/problems/no/583
https://yukicoder.me/submissions/212458
161デフォルトの名無しさん
2017/10/30(月) 00:12:43.74ID:XzbjUl3p 今はコンパイラに解決させるようにしているようだね
haskell - Foldl memory performance in GHC 8.0.x - Stack Overflow
https://stackoverflow.com/questions/42747159/foldl-memory-performance-in-ghc-8-0-x
haskell - Foldl memory performance in GHC 8.0.x - Stack Overflow
https://stackoverflow.com/questions/42747159/foldl-memory-performance-in-ghc-8-0-x
162デフォルトの名無しさん
2017/10/30(月) 00:31:06.68ID:VIeJ5TeT 中身としてはこれかな
foldlを直す - 純粋関数空間 http://tanakh.jp/posts/2014-04-07-foldl-is-broken.html
>>158のように素直に定義したらどっちでも変わらないのはその通りで、
foldlの方は末尾再帰の形になってるからseqすることでいい感じに動いてくれる
foldlを直す - 純粋関数空間 http://tanakh.jp/posts/2014-04-07-foldl-is-broken.html
>>158のように素直に定義したらどっちでも変わらないのはその通りで、
foldlの方は末尾再帰の形になってるからseqすることでいい感じに動いてくれる
163デフォルトの名無しさん
2017/10/30(月) 08:02:56.80ID:WTE/ZW3E164デフォルトの名無しさん
2017/10/30(月) 08:39:48.03ID:rELgjW3C foldlを使うことってほぼない気がする
だいたいfoldl'を使ってる
だいたいfoldl'を使ってる
165デフォルトの名無しさん
2017/10/30(月) 08:42:25.25ID:WTE/ZW3E >>160
その問題は、要するにグラフが準オイラー路になっているかどうかを判定するものだよ。
各駅を頂点、各路線を辺とするグラフが、
準オイラー路であれば彼らは計画達成できるし、
そうなっていなければ計画は達成できない。
グラフが準オイラー路であることと、
次数が奇数の頂点がちょうど2つ存在することとは同値。
要するに、一筆書きができるかどうかだよ。
Haskell で素直に拙くプログラムしても特に問題ないだろうね。
たとえば、N個の要素を持つInt型配列にaccumArrayで次数を集計して、
filterで奇数だけ濾し取り、要素数を調べる。
その問題は、要するにグラフが準オイラー路になっているかどうかを判定するものだよ。
各駅を頂点、各路線を辺とするグラフが、
準オイラー路であれば彼らは計画達成できるし、
そうなっていなければ計画は達成できない。
グラフが準オイラー路であることと、
次数が奇数の頂点がちょうど2つ存在することとは同値。
要するに、一筆書きができるかどうかだよ。
Haskell で素直に拙くプログラムしても特に問題ないだろうね。
たとえば、N個の要素を持つInt型配列にaccumArrayで次数を集計して、
filterで奇数だけ濾し取り、要素数を調べる。
166デフォルトの名無しさん
2017/10/30(月) 08:46:34.46ID:I1PPVtSx >>164
最適化で正格になるはずだけど明示的に正格版使う必要ある?
最適化で正格になるはずだけど明示的に正格版使う必要ある?
■ このスレッドは過去ログ倉庫に格納されています
