関数型プログラミング言語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/
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の振る舞いで有ってるんじゃないの?
0653デフォルトの名無しさん
2011/09/16(金) 23:28:40.55これを UTF8 に変換したいです。
s2 = f s1
この関数 f を提供してくれるライブラリはないでしょうか。
ファイルや標準入力などからの読み込みではなく、
String や ByteString などの中にあるデータを直接変換するものです。
[環境]
・Windows7
・GHC 7.0.3
0654デフォルトの名無しさん
2011/09/17(土) 01:51:13.36スタディがてらマルバツゲームを作ってみたけど正直便利と思えない。
0655デフォルトの名無しさん
2011/09/17(土) 07:36:33.160656デフォルトの名無しさん
2011/09/17(土) 07:37:56.17iconvパッケージを使って
import qualified Codec.Text.IConv as IConv
toString . IConv.convert "Shift_JIS" "UTF-8" . fromString
でいけると思う
IConv.convertはByteStrinを対象としてるから、String用にする為にはStringからByteStringの変換、
ByteStringからStringへの変換をはさんでやるわけだ
0657デフォルトの名無しさん
2011/09/17(土) 09:04:51.64iconvはwinGWかcygwinでしか使えないんですよね。
0658デフォルトの名無しさん
2011/09/17(土) 09:19:07.060659デフォルトの名無しさん
2011/09/17(土) 12:21:07.94帰ったらレポ頼むわw
0660デフォルトの名無しさん
2011/09/17(土) 15:33:06.75http://site.icu-project.org/download/48
ここから icu4c-4_8_1-src.zip (18.9 MB ZIP file for Windows platforms)
を落として次のように nconv をインストールしようとしました。
cabal install --extra-include-dirs="icuソースのフォルダ\source\common" -v3
すると、unicode/platform.h が無いと言われます。
調べてみると、たしかに platform.h.in はありますが platform.h はありませんでした。
platform.h.in を見てみますと、configure 時に autoconf が platform.h を作る
と書かれています。
cabal の install フラグでインストールする時、configure はすると思うのですが、
この時点で platform.h が作られると思ったのですが、違うのですね。
cabal install に渡すフラグが何か足りないのでしょうか。
それとも、cabal install の前に autoconf を実行しておく必要があるのでしょうか。
0661デフォルトの名無しさん
2011/09/17(土) 15:54:54.29icu4c-4_8_1-Win32-msvc10.zip (8.8 MB Windows (x86 32-bit) Visual Studio 10)
こちらの方をダウンロードし、インクルードパスを通して cabal install してみましたが、
今度は ptypes.h が無いと言われました。
icu4c-4_8_1-src.zip の方に icu4c-4_8_1-Win32-msvc10.zip の
platform.h だけをコピーして cabal install してみましたが、
すると今度は expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
などの構文エラーらしきエラーメッセージが大量に発生しました。
windows で cygwin も VisualStudio も無い状態で uconv を使うのは難しいですね。
とりあえずまだ諦めずに、もう少し色々探ってみます。
0662デフォルトの名無しさん
2011/09/17(土) 22:35:11.600663デフォルトの名無しさん
2011/09/18(日) 07:51:50.970664デフォルトの名無しさん
2011/09/18(日) 13:55:41.610665デフォルトの名無しさん
2011/09/18(日) 15:55:19.660666デフォルトの名無しさん
2011/09/18(日) 16:00:27.79数学でどんな分野ですか?
0667デフォルトの名無しさん
2011/09/18(日) 17:07:05.59釣り好きでもフライは興味ないやつも居る
車好きでもカートには興味ない奴も居る
0668デフォルトの名無しさん
2011/09/18(日) 17:52:19.390669デフォルトの名無しさん
2011/09/18(日) 18:00:33.100670デフォルトの名無しさん
2011/09/18(日) 18:40:36.210671デフォルトの名無しさん
2011/09/18(日) 18:42:23.16数学が好きと、数学が得意は必ずしも一致しない
ええ、下手の横好きです
0672デフォルトの名無しさん
2011/09/18(日) 18:43:52.10というよりは、解析学は好きだけど集合論は好きじゃない、の方が近い
集合論は色んな数学の基礎のひとつになってるが、それにはあまり興味は無く、
その上に作られた解析学の方に興味がある、みたいな
ある言語(算法、計算)がチューリング完全であるかどうかは、
計算機科学の基礎の一つではあるが、ハスケラーの間でも興味がない人がほとんどだろ
0673デフォルトの名無しさん
2011/09/18(日) 18:50:00.650674デフォルトの名無しさん
2011/09/18(日) 18:53:23.63おんなの子はハスケルン
0675デフォルトの名無しさん
2011/09/18(日) 19:11:26.86むしろ逆で、いわゆる数学(解析学とか代数学とか)よりも、
計算機科学やその周辺(論理とか集合論)に興味のあるユーザが多い印象
■ このスレッドは過去ログ倉庫に格納されています