関数型プログラミング言語Haskell Part21
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/01/21(月) 02:16:16.07ttp://www.haskell.org/
日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
0159デフォルトの名無しさん
2013/02/16(土) 20:50:39.640160デフォルトの名無しさん
2013/02/17(日) 03:51:51.74↑
この人怖い!
0161デフォルトの名無しさん
2013/02/17(日) 11:15:41.97いや、言われて当然だろう。
ライプニッツがモナドを提唱していた事を知っていたのなら、
「モナド ライプニッツ haskell」でググれば、
それぞれのモナドが無関係なことは直ぐ分かる。
それもしないで食い下がってくれば言いたくもなるぞ。
最近、簡単な調査を怠ってくだらない質問してくる奴多いな。
0162デフォルトの名無しさん
2013/02/17(日) 16:35:21.080163デフォルトの名無しさん
2013/02/17(日) 17:52:26.05まだ根に持ってるの?w
0164デフォルトの名無しさん
2013/02/17(日) 21:02:56.91Filterableってクラスはないのかしら
0165デフォルトの名無しさん
2013/02/17(日) 21:30:23.43Filterableクラスは、具体的にはどんな関数を持ったクラス?
どのようなケースで必要になる? あるいは、どのようなケースであると便利?
0166デフォルトの名無しさん
2013/02/17(日) 21:35:04.15まとめられてないのが気持ち悪く感じたので
同じような機能なら何でもかんでもまとめてクラスにしちゃおうって考え方はマズイかなあ
0167デフォルトの名無しさん
2013/02/17(日) 21:42:58.810168デフォルトの名無しさん
2013/02/17(日) 21:56:30.57何がそんなに気に障るのか
0169デフォルトの名無しさん
2013/02/17(日) 21:57:24.13大した制約があるかどうかに着目した理由がわからない
0170デフォルトの名無しさん
2013/02/17(日) 22:07:20.910171デフォルトの名無しさん
2013/02/17(日) 22:13:08.210172デフォルトの名無しさん
2013/02/17(日) 22:13:50.30Data.List と Data.Set には、filter の他にも
partition や split、(\\) など、共通な関数はあるが、
これらはどうする?
Data.Array 系や Data.Map 系などと Data.Set の間にもいくつかあるね。
0173デフォルトの名無しさん
2013/02/17(日) 22:21:15.08http://www.haskell.org/haskellwiki/Foldable_and_Traversable
ApplicativeとMonoidを要求してるけど、Applicativeに関してはpureしか使わないから、あまり誉められた型クラスの
使い方ではない
しかし残念ながら a -> f a のみの型クラスはデフォルトにはない
リストやSetはMonoidにできるけど、Mapなんかは無理だから、
filterを一般化するには専用の型クラスを作るしかないのかな?
0174デフォルトの名無しさん
2013/02/17(日) 22:26:47.24同じ型のコレクションになるんだから当たり前かと。
0175デフォルトの名無しさん
2013/02/18(月) 03:39:16.79なんて機能があればいいな(提案)
0176デフォルトの名無しさん
2013/02/18(月) 13:39:44.19今日からhaskellやめてpython使いになります
0177デフォルトの名無しさん
2013/02/18(月) 13:47:21.09まあちょっと座って落ち着きなさい
このお茶を飲みなさいな
0178デフォルトの名無しさん
2013/02/18(月) 13:56:17.46お前にOCamlを使う権利を与えよう
0179デフォルトの名無しさん
2013/02/18(月) 15:27:36.990180デフォルトの名無しさん
2013/02/18(月) 20:15:44.390181デフォルトの名無しさん
2013/02/18(月) 21:39:12.720182デフォルトの名無しさん
2013/02/18(月) 22:02:57.670183デフォルトの名無しさん
2013/02/18(月) 22:07:24.60http://hackage.haskell.org/packages/archive/containers/latest/doc/html/Data-Set.html
0184デフォルトの名無しさん
2013/02/18(月) 22:35:39.050185デフォルトの名無しさん
2013/02/19(火) 02:25:51.81ここを追い出されたらどこへ行けば……
0186デフォルトの名無しさん
2013/02/19(火) 03:28:57.54べべ別にアンタが居なくなったら寂しいとかそういうんじゃないんだからねっ!
0187デフォルトの名無しさん
2013/02/19(火) 08:41:26.00と思ったけどYesodがそういう位置づけだったか
「Yesodだとこんな簡単にWebアプリが作れる!!」的なステマが足りないのだろうか
0188デフォルトの名無しさん
2013/02/19(火) 10:35:36.13正直Rails等を置き換えるほどのものじゃないと思うけど
0189デフォルトの名無しさん
2013/02/19(火) 10:58:08.96だと、それが本当だとしても、インパクトが少ない。
目を輝かせたニュービーが大量流入するぐらいのキャッチーさが欲しいところ。
0190デフォルトの名無しさん
2013/02/19(火) 12:38:49.180191デフォルトの名無しさん
2013/02/19(火) 13:38:00.120192デフォルトの名無しさん
2013/02/19(火) 13:44:32.81みたいな事するしかないな
0193デフォルトの名無しさん
2013/02/19(火) 13:48:26.51イージーカムイジリーオカダというではないか
そもそもHaskellの取っ付きにくさを見ればキャッチーなんて縁遠くて然るべきなのだ
Haskellの標語には質実剛健こそ相応しい
0194デフォルトの名無しさん
2013/02/19(火) 13:58:14.390195デフォルトの名無しさん
2013/02/19(火) 14:13:13.900196デフォルトの名無しさん
2013/02/19(火) 14:18:51.350197デフォルトの名無しさん
2013/02/19(火) 15:35:29.87そのせいで他言語やってきた普通の人が他の言語で解決してきた問題をhaskell(関数型言語)でどう解決するのかがぴんとこなくなっていると思う
0198デフォルトの名無しさん
2013/02/19(火) 16:47:25.910199デフォルトの名無しさん
2013/02/19(火) 17:14:52.07底辺はお呼びじゃない。
0200デフォルトの名無しさん
2013/02/19(火) 17:21:42.63そう言う意味では「ふつける」はいい本だったと思う
何故か一部で評判が悪いけど
0201デフォルトの名無しさん
2013/02/19(火) 17:28:04.13Smalltalkと比べろ
0202デフォルトの名無しさん
2013/02/19(火) 17:28:32.84Natural Language Processing for the Working Programmer(Web上で無料で読めるからググれ)
はNLPを題材にしてHaskellも同時に学ぶという本で、
良さそうだったんだけど、まだ未完成。あと英語だし。
0203デフォルトの名無しさん
2013/02/19(火) 17:34:04.94応用を視野に入れて理論をスッキリと概説するのが〜 for working 〜シリーズなので。
タイトルに反してHaskellコードベッタリな本になってしまってる。
0204デフォルトの名無しさん
2013/02/19(火) 17:36:32.470205デフォルトの名無しさん
2013/02/19(火) 17:40:36.400206デフォルトの名無しさん
2013/02/19(火) 17:46:44.86そしてちょっと古い
0207デフォルトの名無しさん
2013/02/19(火) 18:38:10.92・設計上の陥りやすい罠とその回避策をまとめた本が無い
・Haskellデザインパターンが無い
・Haskellメタプログラミング(HMP)本が無い
・HaskellのガベコレがJavaに適わない
・『Haskellの設計と進化』本が無い
・Haskellマガジンが創刊されない
・Haskellラムダキーホルダーが無い
0208デフォルトの名無しさん
2013/02/19(火) 19:01:30.560209デフォルトの名無しさん
2013/02/19(火) 19:23:48.530210デフォルトの名無しさん
2013/02/19(火) 19:41:23.450211デフォルトの名無しさん
2013/02/19(火) 19:53:58.900212デフォルトの名無しさん
2013/02/19(火) 20:12:41.300213デフォルトの名無しさん
2013/02/19(火) 20:27:33.270214デフォルトの名無しさん
2013/02/19(火) 20:37:27.30ってニュースをNHKが流せば、かなり人気出ると思う
0215デフォルトの名無しさん
2013/02/19(火) 21:12:46.430216デフォルトの名無しさん
2013/02/19(火) 23:00:37.580217デフォルトの名無しさん
2013/02/19(火) 23:09:06.870218デフォルトの名無しさん
2013/02/20(水) 01:11:51.91出来るような仕様にしても良くね?不便じゃね?
0219デフォルトの名無しさん
2013/02/20(水) 02:57:49.14ガッチガチじゃあないか……
どれ、早速……
ん、もうかい?意外に速いんだな
0220デフォルトの名無しさん
2013/02/20(水) 07:15:58.95Map型は標準ライブラリの中でも既にFunctorクラスのインスタンスだよ。
Set型は標準ライブラリの中ではFunctorクラスのインスタンスではないが、
必要なら自分でインスタンス化すれば良いだけじゃないか?
0221デフォルトの名無しさん
2013/02/20(水) 08:05:38.310222デフォルトの名無しさん
2013/02/20(水) 10:01:28.62http://www.randomhacks.net/articles/2007/03/15/data-set-monad-haskell-macros
みたいにゴニョゴニョするしかないの?
0223デフォルトの名無しさん
2013/02/20(水) 10:18:39.680224デフォルトの名無しさん
2013/02/20(水) 12:49:29.55では逆に訊くが、もし Set 型が Functor クラスのインスタンスだったら、
Set a 型の値 x と関数 f::(a -> b) に対する関数適用 fmap f x は
どのような戻り値になって欲しいんだ?
具体的な値を使って例示&説明してみてくれ。
その値と戻り値の組みが作れるかどうか = Functor クラスのインスタンスにできるかどうか
という事で良いんだよな?
0225デフォルトの名無しさん
2013/02/20(水) 12:53:49.46まともって何だ?
今自分がプログラムするのに必要となる型に対して、
必要な分だけ過不足無くインスタンスを定義すれば良いだけだと思うが。
もしかして、fmap の結果が同じ値になってしまって、
Set の構造が元のものと変わってしまう、と言いたいのか?
でも、それは仕方ないだろ。
今自分がプログラムするのにそのような仕様が欲しいのなら、
そのようにプログラムすればいい。
構造が変わってしまっては困るのなら、
構造が変わらない場合だけを正しく定義し、
構造が変わる場合はエラーを出すように作れば良い。
0226デフォルトの名無しさん
2013/02/20(水) 13:24:49.73instance Functor Set where
fmap = Set.map
とすれば型エラーになるはず
↓こんな風に
http://codepad.org/ynVAbAoF
fmapは(a->b)->Set a->Set bの関数を要求するけど、これにaとbがOrdであることを付け足すことが文法上無理って話じゃないの?
0227デフォルトの名無しさん
2013/02/20(水) 16:18:39.68http://codepad.org/VdGgAakp
0228デフォルトの名無しさん
2013/02/20(水) 20:12:09.85そりゃ fmap = Set.map なんてすればエラーになるに決まってる。
fmap = 自作しろ
という話だ。
正確に言えば、自分のプログラムの仕様に合うように自作しろ、ということだ。
あと、Set 型は instance (Ord a) => Set a ではない。
Monoid クラスのインスタンスであるために
型引数 a が Ord クラスのインスタンスであることが要求されるが、
Set 型自体が Ord クラスのインスタンスになっているわけではない。
まぁたしかに、Set 型を使う関数の多くが、
型引数が Ord クラスのインスタンスであることを要求してはいるがね。
0229デフォルトの名無しさん
2013/02/20(水) 20:55:55.15Set a のaがOrdを想定していることはMonoidと何の関係もないし、aがOrdでないようなSet aはemptyとsingleton以外には基本的に構築できないし、当然すべきでもない
型チェックをパスするfmapを定義することは、自明で無意味なもの(fmap _ _ = empty とか)を除いて不可能
0230デフォルトの名無しさん
2013/02/20(水) 21:14:23.72もとの質問をちゃんと読んでくれ。>>218
どうあがいても無理なのか? と彼は訊いているんだよ。
Haskell の仕様としてできない事になっている、と勘違いしている。
(Map も Functor ではないと勘違いしているのだから、思い込みも甚だしい)
これを否定する事実を提示するだけで、この疑問は解消されるだろう。
つまり、あがけばできるし、できない仕様にはなっていない事を示せば良い。
instance Functor Set where
fmap f s = let xs = toList s
xs' = fmap f xs
in fromDistinctAscList xs'
それに元の質問は、Functor 版 Set をどのようなシーンでどう使いたいのか
まったく言っていない。
だから、質問は無理かどうかを訊いているだけなのだろう。
0231デフォルトの名無しさん
2013/02/20(水) 21:22:52.68でなんでもFunctorだよ!
0232デフォルトの名無しさん
2013/02/20(水) 21:28:08.210233デフォルトの名無しさん
2013/02/20(水) 21:39:50.06もし質問の回答として
「fmap _ _ = empty にすればいいよ」
と言われたら、質問者を馬鹿にしてるととられて当然だ
そしてfmap=mapMonotonic も全く同じレベルの話だ
だいたいMonoidのインスタンスであるためにOrdがどうこう、みたいな全く頓珍漢なデタラメを言いながら、>>218を「思いこみも甚だしい」だなんてよく言えたものだ
彼は単にMapがFunctorであることを知らなかっただけだろう
0234デフォルトの名無しさん
2013/02/20(水) 21:56:15.19> 彼は単にMapがFunctorであることを知らなかっただけだろう
質問する前に、標準ライブラリのドキュメントの Data.Map のページを見て、
Functor のインスタンスではないかどうかを確認するのが
「普通の質問者のすること」だと思うが。
仕様上できないと思っており、確認もしないのなら、
知らないというよりは思い込みだろ(知らないの部類に入ることかも知れんが)。
質問する前にちょっと確認するだけで分かることだぞ。
正確に言えば、ドキュメントの Data.Map のページには、
This module re-exports the value lazy Lazy API, plus several value strict functions from Strict.
と書かれているのだから、Data.Map.Lazy や Data.Map.Strict を見て確認するだろ。
そこにはちゃんと Functor (Map k) と書かれている。
0235デフォルトの名無しさん
2013/02/20(水) 22:06:13.42たかだかその程度の瑕疵じゃないか
MonoidのためにOrdがどうこうみたいな意味不明な妄言を書いたり、全く無意味な定義で「インスタンスにできる」と言い張ったりするのは「普通の解答者のすること」じゃないよ
少なくとも彼を叩けた立場じゃない
0236デフォルトの名無しさん
2013/02/20(水) 22:52:56.26あぁ、ごめん
Set 型自体が Ord クラスのインスタンスになっているわけではない、
というのは俺の勘違いだ。
Ord のインスタンスになっている。
たしかに叩けた立場じゃないな。
それは謝る。
申し訳なかった >>218 >>235
それとは別に、>>218 の、「どうあがいても」無理か、という疑問には
俺は問題なく答えてるよな。
できない仕様になっている、という誤った認識をちゃんと正してるつもりだが。
0237デフォルトの名無しさん
2013/02/20(水) 23:00:31.06あと、「インスタンスにできる」として例示したものが
全く無意味な定義かどうかは、質問の内容によるだろ。
こういうシーンでこう使いたいのだができないか、
と具体的に質問されれば、あの例では全く無意味である可能性は高い。
しかし、あの質問の内容ならば、無理では無いこと、
できない仕様では無いことの証拠を示す例で十分だ。
それを、こちらが勝手に質問の意図を推測するのは余計だと思うぞ。
0238デフォルトの名無しさん
2013/02/20(水) 23:06:36.53ここでいう「まともな」とは
・Functor則を満たす
・ドキュメントで明示的に禁止されているやりかたでSetのAPIを使わない
の二点を守ること
0239デフォルトの名無しさん
2013/02/20(水) 23:17:03.02でもFunctor則は一応満たすよ
まあFunctor則を満たす「だけ」だけど
0240デフォルトの名無しさん
2013/02/20(水) 23:17:10.16ぱっとみ反例が思いつかん
0241デフォルトの名無しさん
2013/02/20(水) 23:20:31.90でもFunctor則しか満たさない
0242デフォルトの名無しさん
2013/02/20(水) 23:27:57.260243デフォルトの名無しさん
2013/02/20(水) 23:30:20.84ってのがよう分からん
SetのAPIで使い方にルールがある関数があって、
そのルールを満たさないと普通はコンパイルエラーかなんか出るけど、
>>230みたいなことをすると、エラーにならないからダメってことかな
0244デフォルトの名無しさん
2013/02/20(水) 23:30:34.290245218
2013/02/20(水) 23:34:10.28無理っぽいですね
0246デフォルトの名無しさん
2013/02/20(水) 23:34:14.32ほとんどの関数において、なぜSet aのaがOrd aであることを要求されているかわかる?
0247デフォルトの名無しさん
2013/02/20(水) 23:35:21.14たとえばfromDistinctAscListには、昇順なリストしか渡しちゃだめって書いてあるよね
>>230だとfromDistinctAscListに昇順でないリストが渡るかもしれないからまともじゃない
0248デフォルトの名無しさん
2013/02/20(水) 23:35:49.480249デフォルトの名無しさん
2013/02/20(水) 23:41:04.52でもさ、それを言ったら標準ライブラリ自体が「まともじゃない」ってならない?
標準ライブラリが、昇順なリストしか渡しちゃだめ、というルールを設けてるんだから、
昇順性を壊さない関数だけ fmap に渡せるというルールを設けてもいいじゃん。
なんでそれを使った自作関数がルールを設けたらまともじゃない扱いになるの?
0250デフォルトの名無しさん
2013/02/20(水) 23:48:13.53自分で定義する関数ならルールは仕様の一部として勝手に決めていいけど、
クラスメソッドはクラス定義の段階で既に仕様が決まっているから、条件を付け加えるのはまずい
(実用上便利なら、仕様を厳密に守らないインスタンス(Numのabsが実装されてないとか)でも
それなりに許容されるけど、>>230はあまりにも壊れてる)
0251デフォルトの名無しさん
2013/02/20(水) 23:53:52.22ちゃんとやるにはFunctorの定義に手を入れる必要がある
たとえば、
{-# LANGUAGE ConstraintKinds, TypeFamilies, KindSignatures #-}
import qualified Data.Set as S
import GHC.Exts (Constraint)
type family Domain (f :: * -> *) a :: Constraint
class Functor' f where
fmap' :: (Domain f a, Domain f b) => (a -> b) -> f a -> f b
type instance Domain S.Set a = Ord a
instance Functor' S.Set where
fmap' = S.map
type instance Domain [] a = ()
instance Functor' [] where
fmap' = map
0252デフォルトの名無しさん
2013/02/20(水) 23:57:07.72なるほどね、納得。
0253デフォルトの名無しさん
2013/02/21(木) 01:42:41.620254218
2013/02/21(木) 08:24:29.44http://codepad.org/8KWk2kXP
結果が Prob {getProb = [(2,1 % 4),(3,1 % 2),(4,1 % 4)]} になるように
同じ事象をまとめたいのだけどそれには a がEqである必要あるから無理だよね?
0255デフォルトの名無しさん
2013/02/21(木) 16:20:40.14remove :: (Ord a) => a -> [a] -> [a]
remove _ []= []
remove k (x:xs)
| k == x= remove k xs
| otherwise= x : remove k xs
maxElement :: (Ord a) => [a] -> a
maxElement []= error""
maxElement [x]= x
maxElement (x:y:xs)
| x < y= maxElement (y:xs)
| otherwise= maxElement (x:xs)
inOrder :: (Ord a) => [a] -> [a]
inOrder []= []
inOrder (x:xs)= maxElement (x:xs) : inOrder (remove (maxElement (x:xs)) xs)
綺麗にコードしたいのです。
0256デフォルトの名無しさん
2013/02/21(木) 18:05:36.040257デフォルトの名無しさん
2013/02/21(木) 19:30:36.43Quicksortでしたっけコレ?
0258デフォルトの名無しさん
2013/02/21(木) 19:35:08.51quicksort x:xs = [y|y<-xs,y<=x] ++ x ++ [y|y<-xs,x<y]
■ このスレッドは過去ログ倉庫に格納されています