関数型プログラミング言語Haskell Part15
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2011/07/09(土) 17:16:54.84ttp://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/
0552デフォルトの名無しさん
2011/08/29(月) 12:39:26.38これでも駄目かー、パッケージ中のDYLIBの参照先がおかしいのかな
ちょっと自力でiconvパッケージをcabal installしなおして試してくれ
0553SCHEME餃子 ◆8X2XSCHEME
2011/08/29(月) 12:39:39.91それもそうか。
Scheme 使いでも表示的意味論だとか操作的意味論だとかを理解してるやつなんていねーもんな。
0554デフォルトの名無しさん
2011/08/29(月) 13:44:09.450556Perl忍者
2011/08/29(月) 18:30:27.02wwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwww
0557Perl忍者
2011/08/29(月) 18:30:47.02toby_netか?
0558デフォルトの名無しさん
2011/08/29(月) 23:33:15.80こっちにおいでよ。http://hibari.2ch.net/test/read.cgi/tech/1312201995/
0559デフォルトの名無しさん
2011/08/30(火) 10:09:21.15増殖してんじゃねーよ
次は何よ?C#孔雀か?
0560デフォルトの名無しさん
2011/08/30(火) 11:31:54.560561497
2011/08/30(火) 12:40:50.910562SCHEME餃子 ◆8X2XSCHEME
2011/08/30(火) 13:00:49.65Scheme餃子じゃねーよ。 SCHEME餃子だよ。
二度と間違えるな。
Haskell だって case sensitive だろ。 さてはお前、 Haskeller じゃないな?
0563デフォルトの名無しさん
2011/08/30(火) 13:12:15.890564デフォルトの名無しさん
2011/08/30(火) 13:19:58.81正直、そのライブラリをどういう風につかってメモ化を行うのかよく分かりません。
でも、ソース中のCプリプロセッサの使い方は面白かった。
0565デフォルトの名無しさん
2011/08/30(火) 19:19:37.23まずは簡単にインストールできて、
問題なく起動できなければ話にならないのだが・・・
どうしたものか
0566デフォルトの名無しさん
2011/08/30(火) 21:58:21.83(自分は初歩的な知識しかないけど)有望な新人に研修として押し付けるんだけどな
http://www.haskell.org/haskellwiki/Applications_and_libraries#Haskell_applications_and_libraries
0567デフォルトの名無しさん
2011/08/30(火) 22:03:17.280568デフォルトの名無しさん
2011/08/30(火) 22:13:43.07JAVAで作りなさい、おじさんはCOBOLしか知らないけど。
0569デフォルトの名無しさん
2011/08/30(火) 22:25:53.470570デフォルトの名無しさん
2011/08/30(火) 22:26:02.77phpみたいに、htmlに埋め込みでhaskell書けたら本気出す
0571デフォルトの名無しさん
2011/08/30(火) 22:29:26.49ソースの一番最後
0572497, 571
2011/08/31(水) 00:15:24.43反応がないですね・・・
ソースの一番最後に書かれてるように、
メモ化させたい関数を Data.MemoTrie.memo 関数に渡し、
返ってきた関数を元の関数と全く同じように使えばいいです
たとえば、>>432 や >>442 のプログラムだと、
sumX, sumX' :: Integer -> Integer
sumX x = sum [1..x]
sumX' = memo sumX
として、2度記述してある sum [1..100000] の代わりに
2度 sumX 100000 と記述すればOK
sumX の引数の値を大きくすれば効果がよくわかります
本当に実行時間が半分になります
0573デフォルトの名無しさん
2011/08/31(水) 00:17:52.03え、できるだろ
出来ないの?
できるだろ?
0574デフォルトの名無しさん
2011/08/31(水) 00:36:32.36Htmlテンプレート
http://www.yesodweb.com/book/templates/conceptId_________
0575デフォルトの名無しさん
2011/08/31(水) 01:22:47.59いろいろサンクス
{- Test1.hs -}
module Main where
import Data.MemoTrie
sumX, sumX' :: Integer -> Integer
sumX x = sum [1..x]
sumX' = memo sumX
main = print $ {-# SCC "sum1" #-}sumX x + {-# SCC "sum2" #-}sumX x
where x = 1000 * 1000
{- Test2.hs -}
module Main where
import Data.MemoTrie
sumX, sumX' :: Integer -> Integer
sumX x = sum [1..x]
sumX' x = memo sumX $ x
main = print $ {-# SCC "sum1" #-}sumX' x + {-# SCC "sum2" #-}sumX' x
where x = 1000 * 1000
{- Test3,hs -}
module Main where
import Data.MemoTrie
sumX, sumX' :: Integer -> Integer
sumX x = sum [1..x]
sumX' = memo sumX
main = print $ {-# SCC "sum1" #-}sumX' x + {-# SCC "sum2" #-}sumX' x
where x = 1000 * 1000
(つづく)
0576575
2011/08/31(水) 02:20:13.57たぶん、メモ化が働いているんだろうと思います。
しかし、ラムダ式としては同値なはずのTest2がTest1よりも遅いことと、
なぜかTest3.hsのコストセンタ"sum1""sum2"がプロファイルに反映されていないことが、
まだよく理解できませんが・・・
0577Perlにんじん2
2011/08/31(水) 12:41:27.09お前がやっても何も変わらない
何も
何 も
終わり
0578デフォルトの名無しさん
2011/08/31(水) 13:40:39.32たくさん使って恥かいてネイティブに教えてもらって覚えるもんさ
0579デフォルトの名無しさん
2011/08/31(水) 22:55:53.13もはやそんな大それたもんでもないな
Perlのようがよっぽど難しい
0580497
2011/09/01(木) 00:33:52.17ラムダ式としては同値なはずのTest2がTest1よりも遅いのは、
グラフ簡約がうまく働いておらず、同じ内容の環境が2度作られているためです
sumX' x = memo sumX $ x の右辺の x は trie のおかげでメモ化されますが、
左辺の x が「自動ではメモ化されません」
(ちなみに、 $ は不要です)
多少長くなりますが、もう少し詳しく説明した方がいいでしょうか
Test3.hsのコストセンタ"sum1""sum2"がプロファイルに反映されていないのは、
f :: Bool -> Integer
f b = if b then sum [1..8000000] else undefined
main = putStrLn $ show ({-# SCC "sum1" #-}f True)
これでコストセンタ sum1 の処理時間・メモリ使用量がゼロを示すのと同じ理由です
f 関数内の sum [1..8000000] の直前に SCC を置いてみてください
ちゃんと計測できます
私は SCC の仕組み自体をまだよく理解していないので、
なぜ f True の直前ではダメなのか、その理由自体は分かりません
(if 以外にも、関数のパターンマッチや case で分岐しても同様ですね)
0582デフォルトの名無しさん
2011/09/02(金) 19:57:29.63そんな低レベルな事訊くなと言うなら
Haskell初心者質問スレ作って下さい
0583デフォルトの名無しさん
2011/09/02(金) 22:21:38.450584デフォルトの名無しさん
2011/09/02(金) 22:24:41.49スレ立てるまでもない質問はここで 113匹目
http://hibari.2ch.net/test/read.cgi/tech/1312926165/
エスパーが質問に答えるスレ
http://hibari.2ch.net/test/read.cgi/tech/1187922645/
0585デフォルトの名無しさん
2011/09/02(金) 22:50:20.700586デフォルトの名無しさん
2011/09/02(金) 23:06:59.02書き方さえ分かればいいんですね
import Data.List
data Nasubi = Nasu
instance Read Nasubi where
readsPrec _ s = if isPrefixOf "nasubi" s
then [(Nasu, drop (length "nasubi") s)]
else []
こう書けば read "nasubi" :: Nasubi で Nasubi 型の値が得られます
最低限 readsPrec 関数を定義すればいいです
readsPrec 関数の第1引数は無視して問題ないです
read 関数が適用した文字列が readsPrec 関数の第2引数として得られるので、
この文字列の先頭にインスタンス型の値を表す文字列が含まれているか構文解析します
含まれていれば、要素として (構築したい値, 残りの文字列) というペアを一つ持つリストを返します
含まれていなければ空リストを返します
この簡単な例では、構文解析は単に文字列の同値性を調べてるだけですが、
もっと複雑な例えばツリーを表現した型の場合ですと、
再帰的に構文解析する必要がありますね
正規表現やParsecを使って構文解析した方が楽かもしれません
まぁ、Show を自動導出しているのであれば、
>>585 の言うように Read も自動導出した方が楽です
ちなみに、私は Read 型の使い所がさっぱり分かりません
何か役に立つんでしょうか
0587デフォルトの名無しさん
2011/09/03(土) 06:59:55.500588デフォルトの名無しさん
2011/09/03(土) 10:44:57.210589デフォルトの名無しさん
2011/09/03(土) 11:36:49.92Readを自動導入したのなら、read関数で読み取れる文字列が
Showを自動導入した場合にshow関数で得られる文字列に制限されます
後者の場合、読み取り可能な文字列の制限が少しきついです
融通が効かないと言いますか
Persecは比較的簡単で直感的なので、私はPersecでやってしまいます
0590デフォルトの名無しさん
2011/09/03(土) 11:48:55.280591デフォルトの名無しさん
2011/09/03(土) 12:02:26.06bidirectionalizationっていう分野になるのか?
0592デフォルトの名無しさん
2011/09/03(土) 13:56:31.21私はどちらかと言うと、A -> B かつ A <- B みたいなのを
bidirectional っていうのだと思ってました
たとえば、ちょっとした DSL を使って関数(数式)を定義しておけば、
A から B への関数と同時に、逆関数も自動的に作られるみたいな
(当然、必要になるまで遅延される)
0594デフォルトの名無しさん
2011/09/03(土) 16:35:39.50ttp://haskell.g.hatena.ne.jp/mr_konn/20110226/himaprime6
0595デフォルトの名無しさん
2011/09/07(水) 06:59:38.17第49回 GHCの測定機能やプロファイラで並列プログラムの振る舞いを調べる
http://itpro.nikkeibp.co.jp/article/COLUMN/20110906/368177/
0596デフォルトの名無しさん
2011/09/07(水) 12:24:22.400597デフォルトの名無しさん
2011/09/07(水) 12:27:39.75数回前から続いてる一連の流れだし
0598デフォルトの名無しさん
2011/09/08(木) 08:00:50.41その記事に関しては関係なさそうだ
0599デフォルトの名無しさん
2011/09/10(土) 18:26:54.82洋書でも和書でも全く構わないんですが、
Haskell でランクとか kind とか forall とかの意味や役割を
丁寧に解説している本って何か無いですか?
あるいは、forall なら forall(とその関連)だけでいいですから、
まとまって丁寧に説明されているサイトなどあれば嬉しいです
0600デフォルトの名無しさん
2011/09/10(土) 20:11:12.78本なら
http://www.cis.upenn.edu/~bcpierce/tapl/
webなら簡単ですが
http://en.wikibooks.org/wiki/Haskell/Polymorphism
http://en.wikibooks.org/wiki/Haskell/Existentially_quantified_types
あたりですかね。
0601デフォルトの名無しさん
2011/09/10(土) 20:35:25.76ありがとうございます
本の方は、Rank や kind なんかも関係してくるのでしょうか
0602デフォルトの名無しさん
2011/09/10(土) 21:36:06.51高階の型を扱うためのkindと高階関数の多相性の為のuniversal quantified types
もう一つのforallの使い方existentially quantified typesの事もその後ぐらいに載ってる
kindに関する議論があるのは結構最後の方だけども
TAPLでは特に前提としているわけでもないけどでもできれば術語論理や集合論の初歩もあった方がいいかも、
0603デフォルトの名無しさん
2011/09/10(土) 21:39:46.16ドンピシャっぽいですね
術語論理や集合論は最近復習したばかりなので、ちょうどいいかもしれません
その本を購読してみます
ありがとうございました
0604デフォルトの名無しさん
2011/09/11(日) 05:57:21.100605デフォルトの名無しさん
2011/09/11(日) 23:10:01.13教えてもらって良いでしょうか
以下、引用
5.7 練習問題
2.関数lengthと同じように、ある要素のみからなるリストを生成するライブラリ関数replicate :: Int -> a -> [a]をリスト内包表記を用いて定義せよ。以下に使用例を示す。
> replicate 3 True
[True, True, True]
0606デフォルトの名無しさん
2011/09/11(日) 23:31:21.37replicate n x = [y | n > 0, y <- x : replicate (n-1) x]
0607デフォルトの名無しさん
2011/09/11(日) 23:39:53.34それは私も書いて、エラーで弾かれたパターンですね^^;
0608デフォルトの名無しさん
2011/09/11(日) 23:50:17.85replicate n x = [x| _ <- [1..n]]
0609デフォルトの名無しさん
2011/09/11(日) 23:57:36.12俺はこう書いたが、そっちの方が正解っぽいな
replicate n a = [x | x <- take n (repeat a)]
0610デフォルトの名無しさん
2011/09/12(月) 00:17:40.77ありがとうございますm(_ _)m
目から鱗です
勉強になりました
0611デフォルトの名無しさん
2011/09/12(月) 04:45:59.74エラーにはならないよ。
ただ、出題者の意図と違うだろうという気がした。
0612デフォルトの名無しさん
2011/09/12(月) 13:17:56.429章練習問題4と5だけは放置中。
Haskellで使えるGUIって何がポピュラーなの?
0613デフォルトの名無しさん
2011/09/12(月) 18:14:27.080614デフォルトの名無しさん
2011/09/12(月) 18:17:40.000615デフォルトの名無しさん
2011/09/12(月) 18:33:26.88でもどっちも7.2.1にはまだ対応してないんだっけ・・・
0616デフォルトの名無しさん
2011/09/12(月) 21:59:05.630617デフォルトの名無しさん
2011/09/12(月) 22:01:32.460618デフォルトの名無しさん
2011/09/12(月) 22:30:57.680619デフォルトの名無しさん
2011/09/13(火) 20:44:44.190620デフォルトの名無しさん
2011/09/13(火) 21:02:30.89すまん、自己解決してしまった
言語仕様にちゃんと書かれてるのね
A string may include a “gap”―two backslants enclosing white
characters― which is ignored. This allows one to write long
strings on more than one line by writing a backslant at the
end of one line and at the start of the next.
0621デフォルトの名無しさん
2011/09/13(火) 21:03:17.130622デフォルトの名無しさん
2011/09/13(火) 23:53:33.43ありがと、申し訳ない、そっちの方も今度調べてみる
それはそうと、HXT を試しに使ってみたんだがよく分からない
import Text.XML.HXT.Core
getText :: ArrowXml a => a XmlTree XmlTree
getText = deep isText
procXml = processChildren (getText `when` isElem)
test = do
[r] <- runX (readString [] "適当なXML" >>> procXml >>> writeDocumentToString [])
putStrLn r
これで元のXML内のテキストノードだけを集めたXMLが得られると思ったんだが、
結果は "/" ノード以下に何もノードを持たない空のXMLが出力された
例えば isText を isCmt に変えると、ちゃんとコメントノードをだけ集めてくれる
(その場合、readString に withPreserveComment yes のオプションが必要だが)
isText ってテキストノードかどうかを判定するものなんじゃないの?
0623デフォルトの名無しさん
2011/09/14(水) 10:22:11.32procXml = multi isTextでいいんじゃねぇの?
0624デフォルトの名無しさん
2011/09/14(水) 12:47:47.17それでやっても相変わらず得られるのは空の XML だった
でも、いろいろ実験してるうちに偶然変なことを発見した
>>622 に提示した例には、問題には関係ないと思い込み省いてたんだが、
本当は writeDocumentToString のオプションで withIndent yes を指定してた
(http://www.haskell.org/haskellwiki/HXT ここの例を真似た)
で、このオプションを省いてみると、俺の方法でも >>622 の方法でも、
どちらでもちゃんとテキストノードだけを集められた
なんで? (バグか?)
0625デフォルトの名無しさん
2011/09/14(水) 12:49:31.88失敬
> 俺の方法でも >>622 の方法でも
俺の方法でも >>623 の方法でも(multi isText にしても)
0626デフォルトの名無しさん
2011/09/14(水) 16:13:29.43とりあえず最新版にしてもう一度試してみては?
0627デフォルトの名無しさん
2011/09/14(水) 18:43:13.19最新版なんだが(hxt 9.1.4)
0628デフォルトの名無しさん
2011/09/14(水) 18:45:26.660629デフォルトの名無しさん
2011/09/14(水) 21:18:52.20hxt の Arrow の <+> って意味的には OR だよね
deep (isText <+> (getName >>> mkText))
こうやると、"/" タグの直下にひとつ、
元xmlのトップのタグの名前を内容に持つテキストノードだけがあるxmlが得られた
予想では、<+> の左辺に isText があるんだから、元xmlの全テキストノードに、
getName >>> mkText で得られる何かが追加されたxmlが得られると思ってた
getName >>> mkText では何も得られないかも知れんが、
それでも isText で得られるテキストノードだけは得られると思ってた
が、予想に反して得られたのはトップのタグ名が書かれたテキストノードひとつだけ
試しに isText <+> hasName "存在しないタグ名" とやると、
ちゃんと isText の分の全テキストノードが得られる
つまり、hasName "存在しないタグ名" の結果が空でも isText の方は生きる
<+> の右辺って、左辺に(または逆に)影響を与えるもんなんだろうか
hxt ライブラリのソースの ListArrow.h や IOStateListArrow.h などを見てみたが、
<+> 演算は基本的に2つのリストを ++ 演算で結合してるだけに見えるんだが・・・
何か使い方がおかしい?
0630Perl忍者
2011/09/15(木) 12:15:26.73バカ隠し気持ち悪い
0631デフォルトの名無しさん
2011/09/15(木) 12:56:29.22バカ丸出しあたま悪い
0632デフォルトの名無しさん
2011/09/15(木) 13:06:46.910633Perl忍者
2011/09/15(木) 13:09:11.60treeboa=俺だと勘違いしてるゴミ
早く死ね
デートもしたことないかわいそうなやつら
かわいそうだな 彼女暦=年齢
気持ち悪いHaskellやってるんだな
一生だ
気持ち悪い
生産性のないゴミ つまらないゴミ言語
お前らがやっても無駄無駄
0634Perl忍者
2011/09/15(木) 13:10:17.82哀れのゴミ死ね
0635Perl忍者
2011/09/15(木) 13:16:12.94車輪の再発明
てめーはクズだ
わかったな死ね
俺以下ゴミ つまらない発想してんじゃねーぞ
俺の発想はおもしろい
ネタを創造する能力がある
0636Perl忍者
2011/09/15(木) 13:41:30.48教えてください
追加できますかこれ?servermanです
お願いします
0637デフォルトの名無しさん
2011/09/15(木) 17:31:56.68wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
0638デフォルトの名無しさん
2011/09/15(木) 17:34:55.920639デフォルトの名無しさん
2011/09/15(木) 17:37:25.67実際、他の言語に比べておもちゃみたいに簡単なんだが。。。
もっと広まっても良さそうなモンなのにな
0640デフォルトの名無しさん
2011/09/15(木) 17:44:57.130641デフォルトの名無しさん
2011/09/15(木) 23:32:44.40http://ja.wikipedia.org/wiki/エラトステネスの篩
うまく行かないです>.<
何がいけないのでしょうか?
step2 (pL, sL) = step3 (pL ++ [head sL], tail sL)
step3 (pL, sL) = step4 (pL, filter (\x -> x `mod` (last pL) /= 0) sL)
step4 (pL, sL) = if (tail sL) < (tail pL)^2
then (pL ++ sL, [])
else step2 (pL, sL)
main = print $ step2 ([], [2..20])
0642デフォルトの名無しさん
2011/09/16(金) 00:03:20.62(tail pL)^2 って何ぞ?
0643デフォルトの名無しさん
2011/09/16(金) 00:13:22.530644デフォルトの名無しさん
2011/09/16(金) 00:28:29.40宗教や文化遺産でもなければ、誰かの芸術作品でもない
他の言語と何か競争しているわけでもない
使う人がいれば生き残り、誰にも使われなければ消えていく
それだけだ
生き残らせるという考え方自体が間違ってる
0645デフォルトの名無しさん
2011/09/16(金) 01:23:34.47概ね同意だけど、プログラミング言語はある種の芸術作品だと思うんだがなぁ。。。
言語だけじゃ無しに、プログラムって、道具であると同時に作品だと思うんだが
0646デフォルトの名無しさん
2011/09/16(金) 05:49:53.51で、あんたは売らんがための芸術作品を買いたいのか?
0647デフォルトの名無しさん
2011/09/16(金) 06:32:46.43欲しいと思って、金を持ってれば買うだろ。普通
0648デフォルトの名無しさん
2011/09/16(金) 07:52:07.17手続き的に描くならモナド使うのがわかりやすいyp
関数型っぽいやりかたなら http://en.literateprograms.org/Sieve_of_Eratosthenes_%28Haskell%29
あたりみるのがいいよ
import Data.List
import Control.Monad.RWS
import Control.Monad.Identity
type SearchList = [Int]
type PrimeList = [Int]
type Max = Int
type Sieve = RWST Max PrimeList SearchList Identity
pop = do { x <- gets head ; modify tail ; return x }
square x = x * x
last' [] = Nothing
last' a@(x:xs) = Just $ last a
step :: Sieve ()
step = do {
x <- pop ; tell $ [x] -- step 2
; modify $ filter $ (/= 0) . (`mod`x) -- step 3
; y <- gets $ maybe 0 id . last' ; if square y < x then return () else step -- step 4
}
trd3 = (\ (_,_,x) -> x)
sieve m = trd3 $ runIdentity $ runRWST step m sl
where sl = [2..m] -- step 1
ある言語を気に入って、使い続けたいと思うなら、
コミュニティが生き残らないと困るし、可能なら大規模になって欲しいだろ
Haskellがここ数年で急速に実用的になったのは、
コミュニティが十分大きくなってライブラリが整備された/GHCへのフィードバックが増えたのが大きいと思う
0650デフォルトの名無しさん
2011/09/16(金) 08:06:03.13プログラミングHaskellのp.160にあるprimes見たら感動するよ
0651デフォルトの名無しさん
2011/09/16(金) 08:29:20.60色々あるんだなぁあという意味でw
http://www.haskell.org/haskellwiki/Prime_numbers#Turner.27s_sieve_-_Trial_division
0652デフォルトの名無しさん
2011/09/16(金) 16:25:35.76hasName "from" <+> hasName "to"
とやると<from>と<to>の両方が集められたから大体orの意味になってるんじゃね?
とりあえずトップはテキストノードじゃないよね?
で、次にgetNameに行くわけだけど、getNameはタグ名のあるノードつまり全てのノードにマッチするわけだからトップにマッチするわな
んでgetNameでタグ名取得してmkTextで取得したタグ名を内容とするテキストノード生成・・・と
deepだからその時点で探索終了するから>>629の振る舞いで有ってるんじゃないの?
■ このスレッドは過去ログ倉庫に格納されています