関数型プログラミング言語 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/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
最適化で正格になるはずだけど明示的に正格版使う必要ある?
最適化で正格になるはずだけど明示的に正格版使う必要ある?
167デフォルトの名無しさん
2017/10/30(月) 08:49:38.37ID:WTE/ZW3E168デフォルトの名無しさん
2017/10/30(月) 09:33:39.10ID:032bj4sa haskellで連結判定って面倒そう
169デフォルトの名無しさん
2017/10/30(月) 11:24:36.92ID:WTE/ZW3E170デフォルトの名無しさん
2017/10/30(月) 11:28:25.84ID:WTE/ZW3E171デフォルトの名無しさん
2017/10/30(月) 11:57:14.99ID:I1PPVtSx 最適化O2からなの忘れてたすまん
172デフォルトの名無しさん
2017/10/30(月) 12:01:00.21ID:WTE/ZW3E >>160
Haskell が得意なアルゴリズムは分割統治なので、
できるだけ分割統治で解けないか考える、
というのが一般的なアプローチ。
だけど、この問題はそれでは解けそうもないので、
他の命令型言語と同じアルゴリズムを使うしかないと思う。
で、これは一筆書き問題なので、
「連結グラフがオイラー路かまたは準オイラー路なら一筆書き可能」
という定理を利用することになる。
オイラー路や準オイラー路の判定は簡単。
肝は連結グラフの判定だけど、これはもう素直に調べるしかない。
普通ならグラフ用ライブラリを使うところだけど、
競技ならまず使えないだろうから、2次元配列を使ってグラフを表現する。
そして頂点をひとつ決めて、そこから全頂点を辿れるか調べる。
これしかないね。
Haskellにはとことん向かない問題だと思う。
Haskell が得意なアルゴリズムは分割統治なので、
できるだけ分割統治で解けないか考える、
というのが一般的なアプローチ。
だけど、この問題はそれでは解けそうもないので、
他の命令型言語と同じアルゴリズムを使うしかないと思う。
で、これは一筆書き問題なので、
「連結グラフがオイラー路かまたは準オイラー路なら一筆書き可能」
という定理を利用することになる。
オイラー路や準オイラー路の判定は簡単。
肝は連結グラフの判定だけど、これはもう素直に調べるしかない。
普通ならグラフ用ライブラリを使うところだけど、
競技ならまず使えないだろうから、2次元配列を使ってグラフを表現する。
そして頂点をひとつ決めて、そこから全頂点を辿れるか調べる。
これしかないね。
Haskellにはとことん向かない問題だと思う。
173デフォルトの名無しさん
2017/10/30(月) 12:13:21.53ID:/4xzRH5O Haskellわからんからわからんのだがこれとか簡単にかけてそうなんだがそうでもないのか?
https://yukicoder.me/submissions/213035
https://yukicoder.me/submissions/213035
174デフォルトの名無しさん
2017/10/30(月) 12:24:13.36ID:oL0091Lz >>173
連結性の判定を忘れてた
連結性の判定を忘れてた
175デフォルトの名無しさん
2017/10/30(月) 12:25:22.45ID:/4xzRH5O >>174
よく見たらWrong Answerだったわ...orz
よく見たらWrong Answerだったわ...orz
176160
2017/10/30(月) 20:27:20.42ID:kEApsxXD177デフォルトの名無しさん
2017/10/30(月) 22:41:45.81ID:bEDc9q0a 連結判定だけじゃなくてグラフがらみは総じて苦手じゃないかな
178デフォルトの名無しさん
2017/10/31(火) 01:03:17.65ID:hkKKSLGp コンパイラはグラフ簡約するのに言語はグラフ苦手なのかよお
179デフォルトの名無しさん
2017/10/31(火) 01:46:52.15ID:HrVASABH つうか制約のない連結性の判定を深さ優先探索でするのは別にHaskellのせいじゃないだろ
180デフォルトの名無しさん
2017/10/31(火) 03:22:06.20ID:mBYeMGb0 グラフ苦手って競技プログラミングで使う場合のみやろ?普段使う分にはグラフライブラリに突っ込めばいいだけやし気にする必要無いやで!
181デフォルトの名無しさん
2017/10/31(火) 08:27:49.90ID:v6NvB8KL ライブラリでも、計算量は多くなるよね?
182デフォルトの名無しさん
2017/10/31(火) 08:33:52.06ID:ipWwIy6g わざわざ車輪の再発明させる競プロってなんなん
183デフォルトの名無しさん
2017/10/31(火) 08:44:38.36ID:DbaXyY3l Data.Array.(!) や Data.Vector.(!) って O(1) でアクセスできるんですか?
純粋な関数型言語でそんなこと可能なのですか?
純粋な関数型言語でそんなこと可能なのですか?
184デフォルトの名無しさん
2017/10/31(火) 08:50:21.95ID:DbaXyY3l185デフォルトの名無しさん
2017/10/31(火) 10:02:54.23ID:HrVASABH >>183
>Data.Array.(!) や Data.Vector.(!) って O(1) でアクセスできるんですか?
>純粋な関数型言語でそんなこと可能なのですか?
読む分にはO(1)に決まってる
そもそもData.Vectorのドキュメントに様々な関数の計算量が書いてあるだろ
>Data.Array.(!) や Data.Vector.(!) って O(1) でアクセスできるんですか?
>純粋な関数型言語でそんなこと可能なのですか?
読む分にはO(1)に決まってる
そもそもData.Vectorのドキュメントに様々な関数の計算量が書いてあるだろ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【無言】中国怒らせた高市首相→1週間だんまり、国民に実害も説明なし 中国問題を避けてスルー… ★5 [BFU★]
- 「日本はパンダがいなくなる状況に直面するだろう」 中国メディア、専門家の見方伝える [♪♪♪★]
- 【速報】10月の消費者物価3.0%上昇 [蚤の市★]
- 止まらぬ「日本売り」 高市財政への懸念で進む金利上昇と円安 ★2 [蚤の市★]
- ネット殺到「高市総理の責任」「完全に高市リスク」「負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 ★12 [樽悶★]
- 【コメ】価格「5キロ4316円」で最高値を更新…「おこめ券」が解決につながらない根本的な理由 コメ農家が危機感をあらわにする「離農」 [ぐれ★]
- 高市早苗、会食せず議員宿舎に籠って勉強の毎日「飲んでる暇があれば、政策を練り、資料を読みたい」 [485187932]
- 愛国保守、日本を本気で潰しにかかる [819729701]
- 【悲報】Suica、セキュリティを突破されたのが販売されはじめる [347751896]
- 東大名誉教授「中国は誤った宣伝を繰り広げ、対立を煽り、経済の失敗による国内の不満を日本に向けている」 [903292576]
- 【高市速報】日本の政治家も国民も「実利を取る」って選択ができないバカしかいないのか? [369521721]
- 🏡
