[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 10/27 09:49 / Filesize : 201 KB / Number-of Response : 803
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

関数型プログラミング言語Haskell Part8



1 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 20:28:13 ]
haskell.org
www.haskell.org/

日本語サイト
www.sampou.org/cgi-bin/haskell.cgi
www.shido.info/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 pc.2ch.net/tech/kako/996/996131288.html
Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 pc11.2ch.net/test/read.cgi/tech/1174211797/

・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。

52 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:05:04 ]
>>51
randomRIO :: (Int, Int) -> IO Int
というのを考えてみる。これは要するに与えられた範囲の乱数を生成する関数な訳だけど、
厳密に考えると、これは動作を返す関数で、同じ引数で呼ばれたら常に同じ動作を返す。
例えば、(0, 3)を与えて呼び出すと、常に「0以上3以下の乱数を生成する」という動作を返す。
この「動作」を実行した結果はもちろん毎回違うけど、それをHaskellプログラムが
受け取ることはないので、参照透過性には影響ない。
(この動作の結果を受け取って別のことをする、より大きな動作を作ることはできるけど)

これは別に言葉遊びじゃなくて、実際、randomRIO (0, 3)が複数回出てくる巨大な式
f x = ... randomRIO (0, 3) >> ...... fmap (1-) $ randromRIO (0, 3) ...
があったとして、これを機械的に一つにまとめて
f x = let z = randomRIO (0, 3) in ... z >> ...... fmap (1-) $ z ...
としても意味が変わらないことが保証される。これが参照透過性。

53 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:06:11 ]
文法として正しいわけねぇじゃん。あくまで説明用。

54 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:25:41 ]
>>52
アクションやら動作うんぬんとかいうことかー
変数に束縛して使ったときに動作が実行されて〜〜みたいな?
main = do
  rnd <- randomRIO(0,3)
  putStr $ show (rnd :: Int)
とかすると束縛したときはアクションですけどshowに渡るときにはいつの間にか数字ですよみたいなごまかし方(?)なのか?

ていうかghcでコンパイルしたあと実行すると処理が帰ってこないんだけどghciでmain呼ぶとちゃんと表示される罠 意味わかんね

>>53
だってわかんなかったんだもん いぢわるー

55 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:44:46 ]
>>54
do記法で
rnd <- randomRIO (0, 3)
と書くと、rndが束縛されるのは数値Intであって動作IO Intじゃない。
矢印の右辺と左辺は別物。というかこの行だけ取り出すのは無意味。
do式全体で、「randomRIO (0, 3)を実行し、その結果がrndならばputStr $ show rndを実行するという動作」と読む。
慣れるまではdo記法をほどいて
randomRIO (0, 3) >>= (\rnd -> putStr $ show rnd)
に戻して考えるようにした方が分かりやすいかもしれない。

俺の手元ではコンパイルしたのもちゃんと動いたよ。

56 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:57:31 ]
>>55
( ´3`)<よくわかんなーい
乱数を生成する動作を返す関数があって、その動作が実行されてモノホンの数値になる瞬間がある気がするんだけど気のせいなのか?

ちなみに
The Glorious Glasgow Haskell Compilation System, version 6.6.1
ghc test.hs --makeでコンパイルしてtest.exe実行→処理帰ってこない


57 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 01:41:54 ]
>>56
いや、Haskellプログラムは最初から最後まで動作をこねくりまわしてるだけで、
いつ実行されるかという話はあまり関係ない。
「ジャガイモの皮を剥く」というレシピと「茹でる」というレシピから
「ジャガイモの皮を剥いて茹でる」というレシピを合成する、という次元のことをやってる。
この作業をするとき、実際にいつレシピに基づいて料理が行われるかを気にする必要はない。
実際には、プログラムを起動すると即座にmainが「実行」されはじめて、
それに必要な分だけ「評価」が起こる訳だけど。

58 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 07:08:36 ]
なるほどー
レシピは完成品を作っちゃくれないってか

59 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 11:47:38 ]
こねくり回し方を想像できない人は素人

60 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 19:57:03 ]
Haskellの素人なのか園論の素人なのか数学の素人なのかなんの素人なのかさえ分からない俺はキングオブ素人

今日もまたわからないことがいっぱいでした…



61 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:16:10 ]
この場合は処理系の素人

62 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:17:56 ]
ちなみに、園論ではなく圏論(けんろん:category theory)

63 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:25:13 ]
その・さとしさんが提案

64 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:31:53 ]
>>63
誰?

65 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:50:21 ]
>>64
園諭を提案した人

66 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 23:04:52 ]
ハスケルルでメシ食ってる人いんの?

67 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 00:37:52 ]
本業でやってる人はおそらくいない。(研究者除く)

68 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 03:04:27 ]
カリーでメシ食ってるのならいる

69 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 07:50:26 ]
GHC 6.8.1でコンパイルし直しただけで本当にプログラムが二割高速化してワラタ
それから-O2をつけた場合のコンパイル速度が六倍になったけど、これは-fasmがデフォになったおかげだな

70 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 21:01:59 ]
お前ら
コマンドライン引数から複数のテキストファイル名を取得してその中身を標準出力に出力するプログラム書いてみてくれ
IO [String]が…[]外れねぇよチクショウorz



71 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 21:22:15 ]
import System.Environment

main = do
  args <- getArgs
  mapM_ dump args
  where
    dump file = do
      content <- readFile file
      putStr content

こんなの?

72 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 21:30:54 ]
そんなの…

俺とてつもなく頭悪い気がしてきた('A`)

73 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 23:45:24 ]
>>71 のを短く書けばこんな感じ

import System.Environment
main = getArgs >>= mapM_ ((putStr =<<) . readFile)

74 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:57:22 ]
>>71のをArrowで書けばこんな感じ

mapA :: ArrowChoice a => a b c -> a [b] [c]
mapA f = arr listcase >>>
arr (const []) ||| (f *** mapA f >>> arr (uncurry (:)))
where
listcase [] = Left ()
listcase (x:xs) = Right (x,xs)

main :: IO ()
main = runKleisli (Kleisli (const getArgs) >>> mapA (Kleisli readFile) >>> arr concat >>> Kleisli putStr) ()

-- mapAみたいに便利な関数は早く標準ライブラリに入れてほしい

75 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 12:58:22 ]
>>74
モナドと組み合わせると恐ろしく単純にかけるようになる

main = getArgs >>= mapM_ (readFile >>> putStr)

76 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 13:01:01 ]
>>75
Kleisliをつけたり外したりがいらないか?

77 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 13:27:49 ]
まあ、>>>の正体は f >>> g = g . f だからなぁ。

78 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 17:30:40 ]
arrowベースのIOってないもんかね

79 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:17:13 ]
Haskellで開発会社をやりたいという夢を持つ自分はタダのバカですか?

80 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:20:08 ]
実行しようとしない点でバカです。



81 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:25:52 ]
>>80
何こいつスゴいかっこいいんだけど

82 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:26:01 ]
>>79
保守できないに100ルピー

83 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 11:03:25 ]
部下がpoint-free styleで1000行くらいのバグ入りコードを提出

という悪夢を見てしまった

84 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:55:48 ]
>>83
現在適当な粒度の関数に分解する鶴を開発中です

85 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:57:05 ]
>>79
無責任名誉会長は俺ね。

86 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:07:03 ]
>>70
素直にλを残した方が分かりやすいわな。

main = getArgs >>= mapM_ (\a -> readFile a >>= putStr)

87 名前:79 mailto:sage [2007/11/11(日) 19:39:30 ]
しかし、Haskellなどの関数型言語専門会社っていうのは憧れます。

自分はまだ初心者でチュートリアル勉強している段階ですけど、この世界が
広がったら素晴らしいなぁと本気で思ってますよ。

私の現在の妄想は、最近メジャーになってきたWebサービスの関数型版。

住所 -> GoogleMapAPI -> 天気予報 -> 天気マーク付き地図

88 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:53:47 ]
バカっつーか、中学生臭い

89 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:59:51 ]
>>87
それは俗に言う「マッシュアップ」というやつではないか?
関数型言語と関係なくそこら辺の奴でも作れるぞ。

90 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:11:17 ]
そうだな
ただのマッシュアップだな
masuidriveのブログとか見るといいような気がするよ

そして
>>71-77,86の諸氏よありがとう
よく理解できないから明日色々試してみるわ…
Haskell挫折しそう… 書いてて楽なのは分かるんだけど…分かるんだけど…



91 名前:79 mailto:sage [2007/11/12(月) 07:08:04 ]
いや、マッシュアップを関数型でやってるのを見たいんだけど。

もうあるの?

92 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 11:01:32 ]
プロシンあたりで誰か発表してるかも〜

とか無責任に書いてみる

93 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:47:36 ]
>>86
そこまで来たらやっぱりこう書きたくなる

main = getArgs >>= mapM_ ((>>= putStr) . readFile)

94 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:56:09 ]
好みが分かれるもんだな
俺はラムダ抽象が嫌いなのでwhere節を使う

95 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:48:05 ]
>>94
お前の好みはhaskellには不向きだな。

96 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 20:14:14 ]
そうか?俺がHaskell好きな理由の一つがこれなんだが
where節みたいにローカル変数を使った後に定義できる言語は他にはCleanくらいしか知らない
それに嫌いって言っても使うことは結構ある。>>86みたいな例なら迷わずwhereを使うってだけで

97 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 20:58:37 ]
>>96
関数の内部で関数を定義できる言語はいくらでもある。rubyとか。

98 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:06:16 ]
それは知ってる。でも関数を「使った後に定義」はできんだろ

99 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:18:00 ]
使った後に定義ってどういう意味?

100 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:19:56 ]
>>99
ソースコード上で定義が参照よりも後に現れること

f x = g -- ここでgを使う
  where
    g = 2 -- ここでgを定義



101 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:26:38 ]
int main(char args[][]){
    owata();
}

void owata(){
    writefln("\(^o^)/");
}

102 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:27:46 ]
使った後に定義してるわけじゃないけど、遅延評価が便利って言いたいわけね。

103 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:28:18 ]
>>101
>>98はローカル関数の話な、誤解させてすまん

104 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:30:21 ]
>>102
なんというエスパー

105 名前:96 mailto:sage [2007/11/12(月) 21:32:27 ]
>>102
遅延評価はあまり関係ないと思う。あくまでコード上に現れる順序の問題
極端な話、正格な言語で
f x = y where y = 2

f x = let y = 2 in y -- このletは正格
の構文糖なだけでも俺には十分

106 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:26:37 ]
Lisp 系だったらその手の構文糖は作り放題だけどね。
実際、昔 ELisp でそんな感じの macro 自作して使ってたし。

107 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 23:36:21 ]
はいはい自慢はいいですよ

108 名前:デフォルトの名無しさん [2007/11/13(火) 00:18:43 ]
興ざめするから自慢とか言わないでくれよ…

109 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 12:48:47 ]
なら、自己満

110 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:37:02 ]
初心者です。

今、いろんなテキスト漁って勉強中ですが、モナドのところ見てて不思議に思いました。

これって、早晩知らなくてもHaskellが書けるようになったりするんじゃないのでしょうか。
今はまだ途上なので、透過参照を維持できるように云々と理論的な面が表に強く出て
ますけど、近いうちに標準のAPIからは隠蔽されていくということはないですか?



111 名前:デフォルトの名無しさん [2007/11/13(火) 19:37:31 ]
それなら良いわ

112 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:42:46 ]
>>110
>>73をモナドを使わずに書いてください

113 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:57:53 ]
>>110
歴史的にはどうか知らんが、モナドは参照透過性のために仕方なくあるわけじゃなくて、
道具として積極的に使われてる。だからHaskellでモナドが使えなくなることは考えられない。
モナドを知らなくてもIOを書けると良い、という話なら、現状でもできると思う。

114 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:22:01 ]
質問です

>>93をみてこんなの↓つくってみたんだけど、

main :: IO ()
main = getArgs >>= mapM_ ((>>= putStrLn.conv).readFile) >> getCPUTime >>= print
  where
    conv :: String -> String
    conv = unlines.(map ((map toLower).(filter (/= '\"')))).lines

最初に与えたファイルパスのぶんが読まれないっぽいんよ
c:\Users\aiueo> main < c:\a.txt c:\b.txt
と入力すると、b.txtの中身とCPUTimeだけが表示されるんだよね

エロい人なぜだか教えてください

115 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:27:40 ]
>>110
モナドを使わないと、実用的なHaskellのプログラムは書けない。
モナドの理論的な側面を詳しく知らなくとも、モナドを使うことはできる。

結論:
モナドの理論的な側面は今は無視して、モナドを使ってHaskellのプログラムを書けばよろし。
理論的なことは後から少しずつ覚えていけばよろし。

116 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:29:38 ]
>>114
「<」これはリダイレクション

117 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:30:00 ]
>>114
だってそれa.txtは標準入力に与えられてるもんよ
c:\Users\aiueo> main c:\a.txt c:\b.txt こーやれ

118 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:39:55 ]
>>116,117
ありがとう!

119 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:09:22 ]
ちょっとお前ら聞きたいんだけどさ
なんで>>86みたく書くんだ?
main = mapM_ (\a -> putStr =<< readFile a) =<< getArgs
でよくね?モナド使わないときとモナド使うときで読む方向違うのってやりにくくね?
なんか理由あんの?おせーておせーて

120 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:14:55 ]
俺も時々下から順に実行されるdoが欲しくなる



121 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:25:47 ]
>>113>>115
ありがとうございます。"モナド"という言い方がよくありませんでした。Maybeとか
リストのモナドは仰るように積極的に使われていると自分も思いました。

ただ、IOモナドがよく分からんのですね。特にIORefとか。この手のものは、単に
透過参照性を維持するためのテクニックと見えてしまいます。

122 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:34:19 ]
>>119
だったら>>75が自然に見えてくるだろう

123 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:38:12 ]
でも、>>75はコンパイル通らんぞw

124 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:41:42 ]
>>123
処理系とそのバージョンは?

Control.Arrowをインポートしたかどうか。

125 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:48:31 ]
いや、明らかに型が合わんだろ…
readFile :: String -> IO String
putStr :: String -> IO String
(>>>) :: (Arrow a) => a b c -> a c d -> a b d
instance Arrow (->)

126 名前:125 mailto:sage [2007/11/13(火) 21:49:19 ]
間違えた
putStr :: String -> IO ()


127 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:52:41 ]
>>121
参照透過性を壊さないでIOを実現するに当たって、現状よりマシなインタフェースがあるってこと?

128 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:40:51 ]
>>124
無理やりコンパイル通せばこうなるぞ。

main = getArgs >>= mapM_ (readFile >>> (>>= putStr))

Kleisli使うのは俺はパスw

129 名前:デフォルトの名無しさん [2007/11/14(水) 01:19:08 ]
2次関数が苦手だったから関数言語なんて滅びてほしい

130 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 01:31:50 ]
釣られないぞ



131 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 05:55:26 ]
a -> IO b は Kleisli IO a b と同じ構造をもつんだけど、Haskell のnewtypeが違う型として扱ってしまうために、>>75 のように楽天的にはいかないんですな
だからといって 型シノニムで定義できるわけでもないので、しょうがないんだけど


132 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 14:53:09 ]
これでどうよ!

main = getArgs >>= mapM_ (readFile >=> putStr)

133 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 15:38:28 ]
入門HaskellのP104にあるインスタンス宣言について質問なんですが

instance (Eq a) => Eq (Maybe a) where
の(Eq a) => はどうして必要なんでしょうか?

134 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:05:38 ]
>>133
中身が比較できないとMaybeも比較できないじゃん
具体的には、

instance (Eq a) => Eq (Maybe a) where
  Nothing == Nothing = True
  Just a == Just b = a == b -- このa==bが意味を持つことを保証しないといけない
  _ == _ = False

135 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:39:52 ]
>>134
Maybe aとaを同一視してましたorz
わかりやすい説明ありがとうございました。

136 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 19:13:05 ]
do cs <- getContents
hoge <- getContents
putStr hoge

↑のような式を>>=を使って書き直した場合、どのような式になるのでしょうか?

137 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 19:17:43 ]
>>136
getContents >>= \cs ->
getContents >>= putStr

138 名前:136 mailto:sage [2007/11/14(水) 20:05:49 ]
すいません
do cs <- getContents
 hoge <- getContents
 putStr hoge
じゃなくて
do hoge <- getContents
 cs <- getContents
 putStr hoge
の間違いでしたorz


139 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:17:45 ]
>>138
getContents >>= \hoge ->
getContents >>= \cs ->
putStr hoge

このケースでは(>>=)を使う旨みはないね。

140 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:11:24 ]
この場合、
A. getContentsを2回やってからputStr
B. putStr hogeをやるために1個目のgetContentsをやって2個目のは保留
のどっちの動作になるんだっけ。
遅延評価的にはBだよね?



141 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:18:38 ]
>>140
IO動作は上から順に(厳密には>>=の左辺から右辺へ)実行される
getContentsの動作は特殊で、読み込み自体は文字列が必要とされるまで遅延される
だから、順序としては、
1. 1個目のgetContentsが実行され、ハンドルがセミクローズされる。遅延読みのため即座にリターン
2. 2個目のgetContentsが実行され、ハンドルがセミクローズ状態なので例外発生
で、putStrは実行されない

142 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:28:25 ]
そういう風な動作になるのか。ちょっと勘違いしてた。Thanks

143 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:55:19 ]
ここってクロスコンパイルネタはスレ違いですか?

144 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:11:31 ]
ここしかないだろw

145 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:31:03 ]
クロスコンパイルの場合、GHC(6.4.xや6.6.x)のMakefileって修正なしで通りますか?
依存関係を無視したり、更新情報を無視したり、
無いファイルを参照したり、必要なターゲットを生成しなかったりと
明らかに修正しなければならない部分が多々あるようですが


146 名前:143=145 mailto:sage [2007/11/15(木) 00:01:32 ]
私の環境で6.6.1をクロスコンパイルする場合、少なくとも

ホスト、ターゲットで共通
・distrib以下のファイルに実行許可がされていない
・configureでgmpのヘッダ、ライブラリ位置を指定しても途中から無視する
・makeをやり直した場合、すでに生成したファイルで且つ更新の必要がないものでも再ビルドする場合がある

ホストでは、
・libraries/Cabal/cabal-setup/CabalSetup.hcを生成してくれない
・かといってターゲットとして生成したファイルだとundefined referenceが発生するので-keep-hc-filesを指定してCabalSetup.oをリコンパイルしなければならない
・hc-file-bundleする際、libraries/haskell-src/Language/Haskell/Parser.hsという存在しないファイルをアーカイブしようとする

(現在ビルド中ですので途中までしかわかっておりませんが)ターゲットでは
・compiler/primop*.hs-inclが空ファイルで生成される
・compiler/stage1にインタフェースファイルが生成されないためpreludeのビルドに失敗する

等が確認できました

i386-unknown-openbsd → arm-unknown-openbsdという特殊な環境ということもありますが、
普通の環境ではすんなりクロスコンパイルできるのか疑問に思えました

147 名前:143 mailto:sage [2007/11/15(木) 00:07:35 ]
ちなみにOpenBSD-makeではなくGNU-makeを使用しています

148 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 01:19:56 ]
Ubuntu上のemacs22+ghc6-6.1でHaskellのプログラムを色々試しているんですが
C-c, C-lを実行するとよくEmacsが固まってしまって何の入力も受け付けなく
なってしまいます。そのたびにkill -KILLをしているんですが
同じような症状の人はいないでしょうか?

149 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 01:36:11 ]
debianですが、固まりませんね。

150 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 03:01:07 ]
IORefについて質問です。
do ioref <- newIORef 0
 modifyIORef ioref (+1)
 readIORef ioref >>= print

という式の中でmodifyIORef ioref (+1)がiorefの値を変更している仕組みが
どうしてもわかりません。予想としては
・modifyIORefを使うと引数の値を変更できると言語の根っこの部分で決められている
という事かなと思っているんですが、この考えでいいんでしょうか?



151 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 07:23:12 ]
>>150
C言語の例でよければ

*ioref=*ioref+1;

で変更されるのは*iorefであってiorefではない。
Perlなら
$$ioref=$$ioref+1;
といった具合で。
Cで詳細に書いてみる。

void modifyIORef(int * ioref,int (*fn)(int)){
  *ioref=fn(*ioref);
}
int add1(int arg){
  return arg+1;
}
int readIORef(int * ioref){
  return *ioref;
}
int main(){
  int * ioref;
  ioref=newIORef(0);
  modifyIORef(&add1);
  printf("%d\n",readIORef(ioref));
  return 0;
}

まあ(>>=)の部分(doで省略される部分とか)までより近く書くともっと長くなりますが。
それ以前にかけるかどうかちょっと自信ないけど。
*iorefは変更されてもiorefは1回の初期化時の変更のみということで。


152 名前:150 mailto:sage [2007/11/15(木) 08:04:34 ]
>>151
つまりHaskellは、定数だけでなく、変更される変数の値を保存しておくための(つまり再代入可能な)
場所も用意しているということなんでしょうか?

153 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 10:27:06 ]
>>152
実装上はその通り。GHCにはヒープ上に変更可能オブジェクトを置くための機構があるし、
多分Hugsも似たようなもの。
一方で、言語について「Haskellは〜用意している」という言い方をするのは誤解がある気がする。
実際、>>151の言うように、IORefを使っても(Haskellの普通の)変数の値が変更されることはないし、
言語の根幹に変更を迫るような拡張じゃない。
扱える型を限定すれば、自分で(ファイル入出力を使ったりして)IORefみたいなものを書くこともできる。

154 名前:150 mailto:sage [2007/11/15(木) 13:37:19 ]
>>153
よくわかりました。ありがとうございます。
今入門HaskellとふつうのHaskellの二冊を読みながら色々試しているんですが
もうちょっと詳しい説明が欲しいなと思うことがよくあります。
そこでプログラミングPerlのような
・どのようにHaskellでプログラミングするか
・Haskellはどういう理由でこういう風になっているのか
を解説した本が欲しいのですが、テンプレに載っている洋書で↑の内容に
合っている本はないでしょうか?


155 名前:143 mailto:sage [2007/11/15(木) 13:54:41 ]
Makefileを読む時間的余裕が無かったのでとりあえず
find compiler/stage1 -name ¥*.o -exec rm {} ¥;して
make -C compiler boot stage=1 && make -C compiler stage=1したら
ビルド&インストールに成功したようです
後でパッケージを作って本インストールするつもりです

日本語のクロスコンパイルのドキュメントが少ないので
作業過程を簡単に書かせていただきたいと思います
(需要は無いでしょうけど)

うざったいと思われる方は「クロスコンパイル」をNGワードにしてください


156 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 13:56:24 ]
>>154
・どのようにHaskellでプログラミングするか
 →『Haskell: The Craft of Functional Programming』

・Haskellはどういう理由でこういう風になっているのか
 →『Introduction to Functional Programming Using Haskell』

かなあ。両方とも良い本だと思う。まだ全部読み切ってないけど。

157 名前:150 mailto:sage [2007/11/15(木) 21:41:29 ]
>>156
その二冊ですね。お金に余裕ができたら買ってみます。

話は変わるのですがHaskellのガベージコレクションは他の言語(java,ruby...)
と比べて動作する機会がほとんどないと思うんですがどうでしょうか。
変数の宣言時にしか値を入れられなくて、グローバル変数とスタック上に
載せられるローカル変数でほとんど全てが賄えるなら
どこからも参照されていないデータ(ガベージコレクタの対象になるデータ)
ができるなんてことはまずないと思うんですが・・・

158 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 22:41:43 ]
>>157
そんなことはない。遅延評価のために何でもかんでもヒープに割り当てないといけないので、
Haskellは平均的な言語よりずっと多くゴミを出す。
GHCでコンパイルしたプログラムなら、+RTS -Sstderrオプションをつけて実行すれば
GCがどれくらい動いたかが分かる。
適当なプログラムで試してみたけど、約3秒の実行時間中にヒープから700MBほど確保し、
そのうち約9割は第0世代のGCで即座に捨てられてた。

159 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 22:45:57 ]
具体的に数字出されるとびっくりするなw

160 名前:デフォルトの名無しさん [2007/11/15(木) 22:47:23 ]
俺もびっくりしたwww



161 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:07:27 ]
700MB?
700mBの間違いじゃないのか

162 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:15:22 ]
700*2^20 bytesね

741,834,476 bytes allocated in the heap
108,671,480 bytes copied during GC (scavenged)
2,030,404 bytes copied during GC (not scavenged)
13,955,072 bytes maximum residency (11 sample(s))

1415 collections in generation 0 ( 0.55s)
11 collections in generation 1 ( 0.43s)

32 Mb total memory in use

163 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 01:10:19 ]
やさしい Haskell 入門を今見ているんですが
4.4 遅延パターン
www.sampou.org/haskell/tutorial-j/patterns.html
での最初の例
reqs = client init resps
resps = server reqs

client init (resp:resps) = init : client (next resp) resps
server (req:reqs) = process req : server reqs
がどういう意味なのかさっぱりわかりませんorz
どうして↑がだめで
client init resps = init : client (next (head resps)) (tail resps)
だとOKなんでしょうか?

164 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 02:19:04 ]
>>162
これって瞬間最大メモリ使用量が700MBってこと?

165 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 02:50:58 ]
うさのパソコンはメモリ256MB!

166 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 02:52:24 ]
アプリ側がメモリ確保に成功しても、
OS側で本当に実メモリを消費したとは限らないから
調べないと分からないか。


167 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 03:27:46 ]
>>164
アロケートされたメモリの数が700MBってことなのだが、実際はgeneration 0に割り当てられた少ないメモリが使いまわされているだけだから、メモリの使用量自体は少ないはず。


168 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 07:15:29 ]
>>164
OSから確保したのが32MB
実際のヒープオブジェクトの総量が瞬間最大で13,955,072 bytes
コピーGCだからOSから確保した領域の半分以下しか貯められない

169 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 17:49:52 ]
StateモナドでunsafeInterleaveIO的な関数って書けますか?
do
xs <- interleaveState $ sequence $ replicate 3 get
sequence $ map set xs

で get set get set get setの順になるようなやつ

170 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 18:08:04 ]
unsafe禁止令



171 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 18:26:23 ]
xs <- sequence $ replicate 3 $ interleaveState get
の間違いか?
どっちにしても無理だろ

172 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 18:36:40 ]
>>171
すいません、間違いでした
無理orz

173 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:22:17 ]
モナドと代数的データ型に的を絞って詳しく扱ってるテキストはないでしょうか


174 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 03:16:48 ]
foo >>= bar
としたときに実際に>>=がどのインスタンスに定義されている>>=の処理を行うのか、
というのはどうやって決まるんでしょうか?

175 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 07:11:03 ]
>>174
型推論。fooの型とbarの型とその式の使われ方が勘案される。

176 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:11:46 ]
>>175
それはコンパイル時と実行時のどちらでされるものなんでしょうか?

177 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:43:58 ]
>>176
実行時

178 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:57:24 ]
・型推論自体はコンパイル時。
・ただし、型クラスのディスパッチは実行時まで遅延される。
・ただし、どのインスタンスについてのコードを生成すれば良いか静的に決まる場合は、
最適化の一環としてディスパッチを省略する。

こんな感じか。

179 名前:174 mailto:sage [2007/11/17(土) 12:49:35 ]
>>177、178
なるほど、静的に型をチェックしつつ、動作は動的に決まるんですね。

ところで
数学パズル ものまね鳥をまねる―愉快なパズルと結合子論理の夢の鳥物語
ttp://www.amazon.co.jp/%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB-%E3%82%82%E3%81%AE%E3%81%BE%E3%81%AD%E9%B3%A5%
E3%82%92%E3%81%BE%E3%81%AD%E3%82%8B%E2%80%95%E6%84%89%E5%BF%AB%E3%81%AA%E3%83%91%E3%82%BA%E3%83%AB%E3%81%A8%E7%B5%
90%E5%90%88%E5%AD%90%E8%AB%96%E7%90%86%E3%81%AE%E5%A4%A2%E3%81%AE%E9%B3%A5%E7%89%A9%E8%AA%9E-%E3%83%AC%E3%82%A4%E3%
83%A2%E3%83%B3%E3%83%89-%E3%82%B9%E3%83%9E%E3%83%AA%E3%83%A4%E3%83%B3/dp/4627019017/ref=sr_1_9?ie=UTF8&s=books&qid=1195271100&sr=1-9
この本を読んだことがある人いますか?関数プログラミングの土台の考え方がわかる本らしいんですが。



180 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 13:28:59 ]
>>179
途中まで読んだだけだけどコンビネータの話。
S,K,I とか。Yコンビネータも出てきたかは覚えてない。



181 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:07:56 ]
a 1 = "hoge"
a 2 = 2
のような引数によって異なる型の値を返すことはOKなんでしょうか?


182 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:22:37 ]
>>181
template haskell

183 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:25:26 ]
>>181
ダメ

184 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:30:24 ]
2種類の型のどちらかを返したい場合はEitherを使う。
a :: Int -> Either String Int
a 1 = Left "hoge"
a 2 = Right 2

185 名前:182 mailto:sage [2007/11/17(土) 16:51:52 ]
template haskellじゃなくてgeneric haskellだった・・

186 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 22:16:41 ]
>>163
今日Haskell始めたばかりのド素人なんだけど、
ones = addlist 1 onesでも、

addlist init xs = init : head xs : tail xs -- [1,1,1,1,1,1,1,1,1,1]
addlist init xs = init : xs         -- [1,1,1,1,1,1,1,1,1,1]
addlist init ~(x:xs) = init : x : xs     -- [1,1,1,1,1,1,1,1,1,1]
addlist init (x:xs) = init : x : xs       -- C stack overflow

ってなる。要するに(x:xs)が含まれる部分が先に解釈されるとマズいってことじゃないかな。
単体でのxsはパターンはパターンでも手続き型言語での仮引数と同じ程度の意味しかもたないパターンだから暗黙的に遅延される。
head xsやtail xsも関数だからxsが未確定なら遅延される。
でも(x:xs)というパターンは未確定でも遅延しないでxとxsを照合しようとする。
結果的にinitに値がセットされる前にx:xsを延々と調べ続ける。それではマズいので、(x:xs)を遅延パターンにする、ってことじゃないかな。

187 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:24:01 ]
>>163
明日からHaskell始めるつもりのド素人なんだけど、
関数の仮引数xがconstructor pattern(たとえばy:ys)の場合、
それはcase x of y:ys -> ...という形に変換される。
で、caseの条件式はWHNFまで評価されてしまうので、
遅延させたい時には使えない。

188 名前:186 mailto:sage [2007/11/17(土) 23:31:58 ]
>>188
あ、なるほどそういうことなのか。
ありがとう。無理して答えた価値あったわ。

189 名前:163 mailto:sage [2007/11/17(土) 23:59:14 ]
なんとなく理解できました。ありがとうございます。
Haskellの考え方に慣れるまでまだ時間がかかりそうですorz

190 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:28:05 ]
sequence :: Monad m => [m a] -> m [a]
sequence = foldr mcons (return [])
       where mcons p q = p >>= \x -> q >>= \y -> return (x:y)

↑のsequenceの定義を見るとfoldrが使われているんですが、それだと
sequence [putStr "foo", putStr "bar"] の場合リストの後ろの方、
つまりputStr "bar"の方が先に評価されるのに、実際には
fooの方が先に出力されてしまいます。どうして後ろからではなく、先頭から
評価されるんでしょうか?



191 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:55:14 ]
式の評価順とIOモナドの実行順は別物。

192 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 01:04:47 ]
sequence [A, B, C]
= A `mcons` (B `mcons` (C `mcons` (return [])))
= A >>= (\x -> (B `mcons` (C `mcons` (return []))) >>= \y -> return (x:y))

よってA, B, Cの順にエフェクトが出る。


193 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 01:17:35 ]
>>178
Haskell今日始めた人なんだけど
その最適化の一環としてディスパッチが省略された場合ってのは
C++でいうとtemplateによってコード生成された状態と考えていいんですかね

194 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 02:12:23 ]
main = putStr "hoge" >>= \x -> putStr "foo" >>= \y -> return x
main = putStr "hoge" >>= \x -> putStr "foo" >>= \y -> return y
main = putStr "hoge" >>= \x -> putStr "foo" >>= \y -> return "bar"

↑のように最後にreturnさえすればエラーにならずhogefooと出力されるということは、
IOモナドはMaybeモナドやListモナドと違って、最後に何を返すかではなく、
動作をどういう順に行うのかを決めるための仕組みだと考えればいいんでしょうか?


195 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:09:29 ]
>>193
そんな感じ。

>>194
何を返すかによってmainの型が違う。
上の二例ではIO ()で、最後の例だとIO String。
両方コンパイルが通るのは、mainの型はIO αという形なら何でもよく、
生成されたα型の値は無視されることになってるから。

196 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 13:45:25 ]
>>178
実行時にならないとどのインスタンスのコードが実行されるか
静的に決まらない場合ってどんな場合??

197 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 13:51:59 ]
>>196
クラスのインスタンス一般に対して書かれた関数は全部そう。例えば、
double :: (Num a) => a -> a
double x = x + x
こんな関数を定義したら、これをコンパイルする時点ではどの(+)を使うべきか決まらない。

198 名前:193 mailto:sage [2007/11/18(日) 13:56:54 ]
>>197
その関数doubleに対して具体的に値を入れたときに
コード生成される(静的に生成?)んじゃないんですかね?

頭がC++脳なのでtemplateのことばっかり頭に浮かんでしまうんですがね…

199 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 14:08:31 ]
>>198
少なくともGHCやJHCならdoubleが定義されたモジュールをコンパイルする時点でコードを生成する。
そうじゃないと、doubleを使う度に毎回doubleをコンパイルすることになって、
分割コンパイルの恩恵が薄れる。(C++はあえてこれをやってるわけだが)
それから、Haskellの仕様上、完全に静的に済ますわけにはいけない。
newtype P a = P a deriving Show
nq :: (Show a) => Int -> a -> String
nq 0 x = show x
nq n x = nq (n-1) (P x)
こういう関数をtemplate式でコンパイルしようとしたら、無限にnqのインスタンスを生成する必要がある。

あと、実際にはdoubleのような小さい関数はインライン化されるので、ディスパッチが省略される可能性はある。

200 名前:196 mailto:sage [2007/11/18(日) 14:27:36 ]
>>199
なるほど、値(この場合Int)に依存してどういうインスタンスのコードが
実行されるかが決定する場合があるってことか



201 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 14:34:20 ]
1:2:3:[] -> [1,2,3]
↑がこうなるのはわかるんですが
1:2:3 -> ?
とやった場合はどんなデータができるんでしょうか?

202 名前:186 mailto:sage [2007/11/18(日) 14:42:10 ]
3はリスト型じゃないからエラーになるんじゃないかな?

203 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 14:43:06 ]
あ、名前欄消すの忘れてた……

204 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 14:46:12 ]
>>201
(:) :: a -> [a] -> [a]

205 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 14:48:27 ]
>>201
やってみりゃいいじゃん。それで挙動に疑問があったらここでもう一度聞いてみな。

206 名前:201 mailto:sage [2007/11/18(日) 15:25:47 ]
やってみたんですがテキストに書いてコンパイルしようとするとエラーに
なるのにghciで:t 1:2とやると
1:2 :: (Num t, Num [t]) => [t]
というなんだかよくわからないメッセージが出ます。
:tだと型チェックしないのかなと思ったんですが
:t putStr 1
とやると今度はきちんとエラーが出ます。
・1:2 :: (Num t, Num [t]) => [t] は一体どういう意味なのか
・なんで:t 1:2はエラーにならないのに:t putStr 1はエラーになるのか
↑2つになる理由は何故なんでしょうか?

207 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:43:17 ]
>>206
GHCは型クラス周辺を微妙に拡張してるからそのせいだろう。
Haskell98では(Num [t])という文脈はありえない。
Hugsで :t 1:2 と入れたらエラーが出たし。

208 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:44:43 ]
ghcはIOの実装も特殊なんだよなー

209 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:53:43 ]
一応解説。
Haskellでは1とか7とかの整数リテラルは(Num a) => aという型を与えられる。
つまりNumのインスタンスなら何にでもなり得る。具体的にはIntでもIntegerでもRationalでもいいし、
未知のユーザー定義型でもいい。
「1:2」という式では、とりあえず「1」の型をtと書くと、整数リテラルだから(Num t)という制約が必要。
(:)の右辺の型は左辺の型のリストだから、「2」の型は[t]。これも整数リテラルだから制約(Num [t])も要る。
式全体の型は右辺と同じで[t]だから、結果として(Num t, Num [t]) => [t]になる。

210 名前:201 mailto:sage [2007/11/18(日) 16:16:46 ]
やっと理解できました。ありがとうございます。



211 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 16:19:47 ]
なるほど、どこかで instance Num [Int] のようなことが
書かれていないとも限らない、ということですか。

212 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 16:44:20 ]
すいません
初歩的な質問でごめんなさい。

main = do
 cs <- getContents
 putStr.unlines $ lines cs

これはコンパイル通るんですが

main = do
 cs <- getContents
 putStr.unlines.lines cs

これは通りませんでした…これって何故なんですか?
てっきりlinesとunlinesというのは対になってるもんだと思ってたんですが…

213 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 16:50:06 ]
putStr.unlines.lines $ cs
なら通るよ。
関数適用とか演算子の優先順位の問題だね。

f $ g x == f . g $ x /= f . g x

214 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 16:55:54 ]
うろ覚えだが関数抽象より関数適用のほうが優先されるので、
「putStr.unlines.lines cs」の部分が

putStr.unlines.(lines cs)

って解釈されるはず

main = do
 cs <- getContents
 (putStr.unlines.lines) cs

ならたぶん通る


215 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 16:58:16 ]
二項演算子の周りにはスペースを入れようぜw

216 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 17:00:37 ]
C言語で、関数と括弧の間にスペース空ける人?

217 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 17:09:39 ]
いや、そこは詰める
まあ>>215をあまり真に受けないでくれ

218 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 17:23:42 ]
(.) の周りにはスペースを入れない派なんだが
f.g x.h のように関数が引数を持つ場合にやるとなんか微妙

219 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 17:25:16 ]
関数合成が関数適用より優先度低いのが許せない。
こう決めた理由はあるの?

220 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 17:25:37 ]
Haskellの解説文を読んでいて、どっかで見たことある書き方だなぁと
思ったら、数学の教科書とソックリです。

つまり、Haskellは数学ができる人向けってことでしょうか?



221 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 17:31:13 ]
>>213-214
うお、通りました。ありがとうございます。
関数合成と関数適用の優先順位の問題だったんですね。


222 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:15:00 ]
>>219
関数適用最強の原則を守るためじゃないか?
俺は現状で満足だ。
map (fromMaybe 0 . fst) xs
とか書けるし。

223 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:34:32 ]
>>219
うざい括弧をつけなくて済む

224 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 20:16:16 ]
  (f.g) x
 ↑↑うざい括弧

225 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 20:23:03 ]
f.g $ xじゃね?

226 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 20:42:38 ]
>>224
C言語風には f(g(x))
うざくない?

227 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 03:14:41 ]
hpcgi2.nifty.com/1to100pen/wiki/wiki.cgi?p=%CB%E8%C6%FCHaskell
このページの2007-07-04の日記を参考にプログラムを書いているのですが
これで横型探索できる理屈がまったくわかりません

228 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 03:39:03 ]
Stateモナドについて質問なんですが
instance Monad (State s) where
         m >>= k = State $ \s -> let
          (a, s') = runState m s
          in runState (k a) s'

↑の式でm >>= k が m >> kなら、右辺は
State $ \s -> let
(a, s') = runState m s
in runState k s'
((k a)がkだけになる)
という風になると考えていいんでしょうか?


229 名前:227 mailto:sage [2007/11/19(月) 04:04:21 ]
227ですが一応目処が立ちました。

230 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 04:24:37 ]
>>228
それでOK。
ただm >>= kとm >> kのkはそれぞれ別の型だってことに注意。

m1 >> m2 = m1 >>= const m2 なので k=const m2 と考えると
runState (k a) s'
= runState ((const m2) a) s'
= runState m2 s'



231 名前:228 mailto:sage [2007/11/19(月) 10:59:03 ]
うーん、難しい
>>=が一つだけならなんとか頭で理解できるんですが>>=が二つ以上ならんでいたり
do式で表されていたりすると脳味噌が追い付きませんorz

232 名前:143 mailto:sage [2007/11/19(月) 23:12:23 ]
*GHC-6.6.1のクロスコンパイルについて公式ページのwikiに書いてない部分*

<ターゲット、ホストに共通>
デフォルトサーチパスにGNU MPがない場合は--with-gmp-{includes,libraries}で指定する必要があるが、
途中からこの指定(ライブラリサーチパス)を見てくれなくなる上、
できあがったGHCでも-Lオプションを指定しなければいけなくなるので
(少なくともlibgmp.so.*かlibgmp.aファイルのどちらかを)デフォルトサーチパスにシンボリックリンクしておくほうがいい。

<ホスト>
ghc-6.6.1/Makefileの
echo ghc-$(ProjectVersion)/libraries/haskell-src/Language/Haskell/Parser.hs >> hc-files-to-go
という行を削除またはコメントアウトする必要がある。

libraries/Cabal/cabal-setup/CabalSetup.hsが作られないので、
cd compiler && make boot && makeの後、
cd libraries/Cabal/cabal-setup
rm CabalSetup.{o,hi} cabalsetup
../../../compiler/ghc-inplace -H16m -O -H32m -package Cabal -c CabalSetup.hs -o CabalSetup.o -ohi CabalSetup.hi -keep-hc-files
../../../compiler/ghc-inplace -o cabal-setup -H16m -O -H32m -package Cabal CabalSetup.o
する必要がある。

make hc-file-bundle Project=Ghcの前に、
make -C rts AutoApply_thr.hc AutoApply_thr_p.hc AutoApply_debug.hc AutoApply_thr_debug.hc
する必要がある。

続く

233 名前:143 mailto:sage [2007/11/19(月) 23:14:33 ]
*GHC-6.6.1のクロスコンパイルについて公式ページのwikiに書いてない部分* 続き

<ターゲット>
いきなり/usr/localにインストールするのではなく、stage1のためのディレクトリにインストールして、
それを利用してもう一度ghcをビルドしたほうがいいと思われる。

*-hc-tar.gzをソースツリーにコピーするのではなく、展開されるghc-6.6.1を手動でソースツリーに上書きする必要がある。

distrib以下のスクリプトに実行権限を与える必要がある。

hc-buildが完了した後、
cd compiler
rm -f *.hs-incl
make primop-can-fail.hs-incl primop-commutable.hs-incl primop-data-decl.hs-incl
primop-has-side-effects.hs-incl primop-list.hs-incl primop-needs-wrapper.hs-inc
l primop-out-of-line.hs-incl primop-primop-info.hs-incl primop-strictness.hs-inc
l primop-tag.hs-incl primop-usage.hs-incl
find . -name \*.o -exec rm {} \;
make boot stage=1 && gmake stage=1
cd ..
make install stage=1
で完了。

ちなみにザウルスのOpenBSD上では16MB以上のテキストセグメントがある実行ファイルは実行できないので
テキストセグメントを32MBに拡張したカーネルを使用しなければビルドできませんでした。
GNU makeがmakeという名前以外(gmakeなど)でインストールされている場合は、適宜読み替えてください。
かなり効率の悪い方法なので、Makefile等をちゃんと読めばもっと最適化できると思います。

古いGHCで新しいGHCをビルドするのはうまくいきますが、
新しいGHCで古いGHCをビルドするのはなかなかうまくいきませんね。

234 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 08:39:00 ]
一度評価された式をもう一度評価しようとする場合って、再度最初から評価しなおすんですか?

例えば
add x y = x + y
という関数があって、一度
add 1 2
という式を評価した後もう一度
add 1 2
を評価しようとするとき、内部では律儀に 1 + 2 を行うんでしょうか?それとも
add 1 2 = 3
みたいな式が内部で作られてたりするんでしょうか?

235 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 09:30:04 ]
↑の場合は俺も知りたいです

俺が知ってるのは
f x a b c = a*x*x + b*x * c
という関数に対して
f (1+2) 3 4 5
と呼び出した場合に1+2が1度しか評価されないことくらい…

236 名前:デフォルトの名無しさん [2007/11/20(火) 10:20:01 ]
>>234
Haskellの規格では規定されてないけど、普通は評価しなおす。
関数を全部メモ化していたら、救いようのないメモリリークが起こるはず。ただし、
map (\x -> x * add 1 2) xs
のようなコードが最適化されて
let _z = add 1 2 in map (\x -> x * _z) xs
になって、add 1 2が一回しか計算されない、という場合はある。

237 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 11:41:31 ]
>>234-235
コンパイラのコンパイルオプションによっても動作が違うかな

import System.IO.Unsafe
f n=seq (unsafePerformIO $ putStrLn "hello") n

a=f 1+f 1

main=print a

のようなコードだとGHC6.6.1の場合で最適化なしの場合とありの場合でhelloの表示回数が違ったりする。


238 名前:237 mailto:sage [2007/11/20(火) 11:44:46 ]
追記

a=f 1+f 2

でも最適化ありで1回表示、 無しで2回表示でした。


239 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 18:31:21 ]
質問なのですが、
ドラキュラとかが眠ってそうな感じの、棺おけ型のベッドというのは市販されているのでしょうか?
冬の暖房の時期に、部屋ごと暖めるのでは効率が悪いので、棺おけの中だけ温度調節できれば
コスト安になると思ったのです。
また、フタをつけるので静かですし、明かりもシャットアウトできてよいと思うのです。

240 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 19:04:23 ]
ドラキュラとかが眠ってそうな感じの、棺おけ型のベッドというのは市販されているのでしょうか?
(計算をデフォルトで遅延させる機能のある、関数型のプログラム言語は市販されているのでしょうか?)
冬の暖房の時期に、部屋ごと暖めるのでは効率が悪いので、
(評価されない可能性のある式を正格に評価するのは効率が悪いので)
棺おけの中だけ温度調節できればコスト安になると思ったのです。
(必要になってから評価できれば計算コストを削減できると思ったのです。)
また、フタをつけるので静かですし、明かりもシャットアウトできてよいと思うのです。
(一度評価されればメモ化されるので計算量が少なくなりますし、バグの混入もシャットアウトできてよいと思うのです。)

答え:Haskellは無料で公開されています

こうですか!? わかりません!




241 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 19:27:37 ]
感動した

242 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 04:31:54 ]
質問です

GHC6.8.1にはHGL入ってないんですか?

243 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:59:38 ]
Windowsアプリ作っていて気づいたんだが、
Win32モジュールにはSetLayeredWindowAttributesのラッパは入ってないんだな・・
自作するしかないんだろうか。

244 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 07:26:41 ]
書いてパッチを送るんだ!

245 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 12:20:00 ]
>>244
>書いてパッチを送るんだ!
いや、これってwindows2000以降の機能で、Win32モジュールに入れるべきかどうか正直迷うんだよね。

246 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:16:48 ]
Windows2000以降のラッパをまとめたWin32exモジュールを作ったので公開しました。
ツッコミなどよろしく。

247 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 09:58:22 ]
>>245
Windowsに詳しくないので間違ってたら済まんが、2000以降のみの関数も
普通にwin32パッケージに入ってないか?setConsoleCPとかfindFirstChangeNotificationとか。

>>246
どこに置いたかも書けよw

248 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 10:06:51 ]
246はPeyton Jonesだ。

場所は、わかるだろ。

249 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:05:20 ]
関数型言語はマルチコア時代にフィットしているという話を聞いたことがあります。
既存の流行している言語は対応できてないと。

これはどういう理由でしょうか?遅延評価とか、その辺のことを指しているんでしょうか。

250 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:13:40 ]
知らんけどミュータブルな値があるとスレッドセーフにならないとかそういうへんの話じゃね?



251 名前:デフォルトの名無しさん [2007/11/26(月) 23:23:18 ]
MapReduce の「副作用が無ければ無限にスケールする」というのが
一人歩きしてるだけじゃないかな。実際には何をするにも副作用は
あるし、MapReduce だって Reduce の作業はスケーラビリティが
殆ど無いか少ない。関数型言語には副作用が無いというのと同じ様な
勘違い。ただ副作用が無い=スケールする部分を奇麗に切り出せる
のであれば有用ではある。

252 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 11:43:41 ]
ああいう大規模データパラレルとマルチコアはあんまり関係ないじゃん。
>>249の話は伝聞なんで雲を掴むような話だけど。


253 名前:249 mailto:sage [2007/11/27(火) 11:48:13 ]
ありがとうございます。透過参照性がスレッドセーフというのはよく分かります。

遅延評価っていうのは、別に関係ないんでしょうか。何かそっちの話を聞いた
ことがあるんです。自分の初心者脳では、正格では無限のリソースを前提に
した関数を書けないが、Haskellのような言語だと記述可能、とか思ったのですが、
ちょっと頭悪いですか?w

254 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 12:16:38 ]
遅延評価や投機実行をうまく使えば、
CPUコアの利用効率を上げられますが、
それには頭のいいスケジューラが必要なわけで。

例えば、
www.fixstars.com/Grid/pukiwiki/index.php?MapReduce
にプチ解説があるようなstragglersの問題。

ただ実行順序が規定されてないので、
工夫する余地がまだまだ残されているとは言えると思う。
Erlangのような言語が、あまりpure functionalじゃないとはいえ、
一通りの実績を上げていますし。

また、プログラマがスケジューラに自由を与えるような
プログラミングスタイルを強制されているという見方もあると思う。



255 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 10:41:19 ]
F#のスレは毎日更新されてますが、こちらは静かですね・・・

関数型で今イチバン売れ筋なのはF#なんですかね。

256 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 17:36:48 ]
Haskell始めてから3週間目の今の感想。
・概念的にはMonadよりArrowのほうが分かりやすいんじゃないか?とか。
・Monadって何?って聞かれるとなんと答えていいかわからないが、
  Arrowなら『矢印をカプセル化したようなもの』と言える。
  あとは適当に結合演算とか普通の関数をアロー化する演算とか実装していけばおk。
  脳内のイメージも矢印をつないでいくだけだし。
  Monadをイメージしようとしてもなんかいまいちピンとこない……。
  bindにやる夫関数とか適当に名前を付けて無理矢理イメージしたけど。
・Monadのbind演算子(>>=)はm a -> (a -> m b) -> m bで非対称的。
  Arrowの(>>>)はa b c -> a c d -> a b dで比較的対称性があって気持ちよい。
・Arrowは『計算を結合』しているのが自明的に表現されてる。
  Monadは別にそうは見えない。……値と計算を結合なのか?意味わかんね。
・そもそも非対称な二項中置演算子はイマイチ気に入らない。
  リスト結合演算子とか`elem`とかは仕方ないけど、せめてあまり高階にしてほしくない
・Monadの計算部(a -> m b)は結構重要なパーツの一つなのに、名前が付いてない。
  だから『モナドを返す関数』としかいえねえ。
  しかもbindした後にはその返り値とは(型は同じだけど)別の奴が帰ってくる。無駄に混乱。
  その点Arrowは計算部がずばり『Arrow』。カプセル化されていて美しい。
・Monadは(>>=)は左から右へ流すように使えるが
  普通の関数は右から左。もちろんliftMとかも右から左。
  (=<<)も右から左。しかし関数を拡張して適用するという見方で見るとこっちが自然という謎さ。
  結局どっちからどっちへ読むべきか迷う場所が多く、思考停止してしまう。
  ArrowだったらArrowとして結合されている部分は左から右。
  普通の関数は右から左で思考が自然に切り分けられる。

257 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 17:37:32 ]
・Monadでポイントフリースタイルをやろうとするとかなりキモくなるよね。
  Arrowはまあ基本的にポイントフリーな感じがするし、普通の関数と分けられていいんじゃない?
・Arrowの構造を作ったりする関数は基本的にArrowだけを返す。
  Monadの関数はなんかリストとかに入ってたりして気味が悪い。モナドのリストって、最中十個入りじゃないんだから。
・Arrowの構造を作る関数はキチンと構造を作ってるように見える。
  Monadの場合は解読に時間がかかる。なんのためにこんな書き方をしてるんだろうとか……。
・ArrowでStateを自作してみたら比較的分かりやすかった。
  Monadのは今見ても訳が分からん。というかMonadの対象が関数って何だよ。
・Monadに慣れ親しんでる人はMonadを扱うのに苦労しないだろうから、
  簡単なものなら短い表記が出来るMonadのほうがいいんだろう。
  しかし、初心者にいきなり教えるのならArrowのほうが直感的。
  ポイントフリースタイルを使いまくってムツカシイことさえしなければ。
・Arrow講座みたいな入門編とかでArrowを書くとき、
  関数がそのままアローになるからってやたら省略しないでいただきたい。
  アローな部分と普通の関数の部分が綺麗に分かれてるのがいいんだから……
  それにarrってやっておけばその部分は一般のArrowでも使えるし。
  SF f >>> SF g = SF (f >>> g)とか出来るからそういう書き方が出来ること自体はありがたいが。
・arr.uncurryとかarr.constってよく出てくるけどそういう関数はないのか……
・Arrow関係ないけどデータ構築子と型構築子が同じ名前って混乱するな。時々イラっとくる。
・aとかbとか何を表してんのか直感的じゃねえよ。型変数だったり、引数だったり……
  fって名前だから関数かと思いきやArrowだったり。
  ネーミング規約みたいなものはないのか……
  Arrowが引数で来たときの名前の付け方とかおもいつかねえけど。
・そろそろふつける買おうかな……。
・初心者のくせに身の程をわきまえない長文失礼しました……

258 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 17:42:34 ]
>>257
> ・Monadでポイントフリースタイルをやろうとするとかなりキモくなるよね。
もう少し他人のコードを読んでいくと感覚がつかめてくると思いますよ

259 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 18:11:18 ]
モナドのリストを返す関数なんてそんなに使うか?

しかし「モナドのリスト」って言い方は何か違和感あるな。
[IO]みたいなのを想像してしまう。

260 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 18:16:50 ]
俺のポリシーではIOはmain内でしか使わない



261 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 18:25:06 ]
>>258
把握。

>>259
ライブラリを見返してるけどそこまではなかったかも……。
初めて見たときに比べればそこまで疲れないし。
やっぱり慣れの問題なんだろうか。『モナドを返す関数』が普通の関数と同じ地位にいるのがイマイチだけど。
引数の数でバージョンがいくつもあったりするのもなんかいただけない。
でもやっぱり慣れれば気にならなくなるんだろうな……。
なんかJavaやったらCのポインタが理解できた時の気持ちを思い出した。(違うか)

262 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 18:30:02 ]
モナドなんてステートとIOとリストとMaybe以外はほとんどつかわねーぜ

263 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 18:30:44 ]
IORefもつかうか。

264 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 18:38:36 ]
a0 -> a1 -> ... -> m bの形の関数を呼ぶのにはmonadic functionという名前が使えるはず。
日本語だと「モナドな関数」か。

俺のコードの大部分はモナドな関数になってるな。
普通の関数より書きにくいから嫌なんだが、変更に強いコードにするために仕方なく。

265 名前:デフォルトの名無しさん [2007/12/08(土) 12:05:09 ]
やさしいHaskell入門での質問です。

www.sampou.org/haskell/tutorial-j/classes.html
> (ここで、同値性といっているのは、「値同値性」のことです。
> 対照的な概念としては、「ポインタ同値性」というのがあります。
> たとえば、Java 言語の == です。
> ポインタ同値性は参照透明性を持ちません。
> それゆえに純粋な関数型言語とは相性がよくありません。)

なぜポインタ同値性は参照透明性を持たないのですか?

266 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 12:26:42 ]
>>265
ポインタ同値をテストする関数eqがあったとすると、
let v = [1,2] in eq v v
はTrue。一方、vを展開して
eq [1,2] [1,2]
とするとFalseになるかもしれない。
参照透過って言うのはそもそも、こういう展開をしても
プログラムの意味が変わらないってことだから、
eqによって参照透過性が破られたと言える。

267 名前:265 mailto:sage [2007/12/08(土) 12:37:55 ]
>>266
おー!なるほど。わかりやすい説明ありがとう。
[1,2] が複数箇所に出現する場合、メモリ上に別々に配置されるかもしれないわけですね。
勉強になりました。

268 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 15:29:39 ]
『A a』っていう表記が使われる場所によって
Aは型構築子、全体は多相型、aはパラメータ
Aはデータ構築子、全体はデータ構造、aはその中身
aは型クラスAのインスタンス、何かの型の一部
って変わるのがちょっとわかりにくいね。もうちっとなんとかならんか。

269 名前:デフォルトの名無しさん [2007/12/09(日) 21:35:19 ]
Haskell勉強してなくてよくわからないんですが、
乱数生成器をsplitしていくつかにしてseed固定で乱数を作れといわれました。
どう作ればいいんでしょうか?
初歩的な質問だったらすみません。

270 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 00:51:19 ]
日本語でおk



271 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 15:07:15 ]
無限リストって便利だけど、末尾を正格に要求する関数について型安全じゃないよね。
でも無限リスト型を再定義するとリストに関して作ったすべての関数について委譲関数を作んなきゃいけなくて現実的じゃない。
結局これは妥協するしかないのか?それともなんらかのテクニックで回避できる?

272 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 10:46:48 ]
>>271
日本語でおk

273 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 10:52:25 ]
>>271
俺の知る限り、妥協するしかない

274 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 12:46:45 ]
>>271
評価がとまらないだけで型安全だよ。

275 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:17:06 ]
そう言えば、厳密に言うと無限ループでも型安全なんだな
でも全域関数でない関数が厄介なことは事実だから、何か呼び名が欲しい

276 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 17:14:07 ]
>>275
よくわかんないけど、チューリングの停止問題のこと言ってるの?

277 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 17:30:25 ]
>>276
いや、Haskellには失敗し得る関数があるじゃん
例えば、headはリストが空の時例外を飛ばすし、
lengthは無限リストに適用されたら終わらない
一方で、例えばdropみたいに、引数に未定義値が含まれない限り、
あらゆる引数に対してちゃんと値をもどす関数もある
だからこの二つを区別できるように、短い呼び名があれば便利だな、ということ
「型安全」という言葉を使いたくなるけど、これは>>274の言う通り誤用だし

278 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 17:40:12 ]
>>277
そういう一般的な関数のことを部分関数というんじゃないかね

279 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 18:03:01 ]
>>278
全域関数も部分関数の一種だから、とか考えてたけどカジュアルに使う分には問題ないか
グダグダですまん

280 名前:271 mailto:sage [2007/12/11(火) 19:46:50 ]
いや、同じ構造のデータ型でも、
型システムで『無限リストかそうでないか』をカッキリ分けられたら、
そっちのほうが型安全にならないかな?と思って271を書いたんだけど。

たとえば幽霊型とか使ってそういうのが解決できないかとか思ったんだけど、
それじゃ現行の関数を活かせないし、あんまり意味ないなあ、と。



281 名前:デフォルトの名無しさん [2007/12/12(水) 01:00:18 ]
>>280
言いたいのは、型システムを使って、
無限リストのフロー解析をして、
プログラムの停止性、正当性などを知ることができないかってこと?
それならリストの有限性の抽象解釈をやるってことになると思うけれど。

282 名前:271 mailto:sage [2007/12/12(水) 01:16:01 ]
>>281
違う。返り値が無限リストの関数で、その関数の型を明示しておけば、
無限リストに対して使ってはいけない関数の引数にした時に型エラーになるようにしたい。
まあ無理っぽいのでもう諦めてるけどな。

283 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 02:43:32 ]



※起こりえる全てのリストのうちどれが有限リストかを確かめることは
 無限に長いリストに対して演算を行うことと同じ


ってだれかが言ってた

284 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 07:57:59 ]
だから誰も自動チェックしてくれって言ってるわけじゃないじゃない……
静的に型推論してくれるんだから、
enumFromにInt a => a -> [a] Inf
って書けるとして
lengthに[a] Ltd -> Int
みたいに指定したらコンパイルエラーになって欲しいとかそういう問題だって。無理だけど。

285 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 08:17:31 ]
enumFromよりrepeatのほうが良かったな(repeat :: a -> [a] Inf)
あとコンパイルエラーになって欲しいのは『length.repeat x』みたいな文脈な。

286 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 09:39:03 ]
strictな言語なら、force/delayみたいに陽に指定するんだろうから、
>>281の言うような方法も効果を挙げるだろうが、
lazyな言語だと、リストを生成する全ての関数が、
無限リストを返す可能性があるので>>276でFAだが。

[1..]が無限リストであることも、解析が必要になるし。
うまくできるケースもあるが、希少すぎる。

287 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 11:18:26 ]
>>271が見事に無視されててワラタ

288 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 11:39:59 ]
言葉の使い方間違ってるよな。

289 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 17:16:57 ]
なんというか残念賞な言語だな。
関数言語としてのおいしいところは全てC#3.0に持っていかれてしまった。

290 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 17:26:09 ]
それはギャグのつもりでいっているのか



291 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 17:27:04 ]
>>289
関数言語?w
C#3.0?w

292 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 18:12:14 ]
>>289
F#じゃなくて、C#かよ・・・

293 名前:Wadler [2007/12/12(水) 22:26:38 ]
Haskell初心者です。
a->[a]という(型の)monad(仮にDとしましょう)をつりたくて困っています。
どなたか教えてください。
とくにDのmapFにあたる関数も教えていただけれありがたいです。

294 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 23:11:10 ]
>>293
はい?

295 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 23:12:01 ]
とりあえず、日本語でおkと言ってほしいのですか?

296 名前:デフォルトの名無しさん [2007/12/12(水) 23:13:50 ]
>>295
日本語でおk

297 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 00:02:02 ]
よくわからんが
data D a = mkD (a -> [a])
instance Monad D where ...
ってことか?
あとmapFってなんだ?fmap?

298 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 01:20:15 ]
>>293
よくわからんが、釣りってことか?

299 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 01:23:14 ]
>>297
mkDはなぜ先頭が大文字になってないんだ?
受理されないだろ。

300 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 01:25:29 ]
なんなんだ?
近頃Haskellerの質の低下が激しすぎるぞ



301 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 02:15:06 ]
昔からです


302 名前:デフォルトの名無しさん [2007/12/13(木) 02:20:10 ]
割と玉石混淆なイメージだね

303 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 02:23:35 ]
暇つぶしで弄ってる学生がここで暇を潰しているイメージ

304 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 08:17:19 ]
>>299
>>303
そのとうりですすいません……

305 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 11:07:28 ]
>>268-304
この辺からおかしくなってきてる

306 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 11:49:46 ]
なんにしてもHaskellerが増えるのは喜ばしいことだ

307 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 11:51:12 ]
rubyみたいになるぐらいなら少なくてもいい

308 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 16:58:02 ]
少数精鋭投入ならこれでいいだろうけど
大人数投入用にコードもデータもブラックボックスにできる仕組み(命令型のオブジェクト指向同等?)誰か作らないのかな

309 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 17:07:09 ]
大人数投入っていまどき流行らないよ
人海戦術でプログラミングする時代は終わった

310 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 17:23:49 ]
>>308
ブラックボックス化ってどんなの?
カプセル化なら標準のモジュールシステムがあるけど



311 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 17:28:42 ]
>>308
そんなにオブジェクト指向がやりたいなら
つ O'Haskell

312 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 17:30:17 ]
でも、そもそもオブジェクト指向は型理論に包含されるものだから・・・

313 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 17:31:50 ]
デバドラ屋と少数のhaskellerがいればたいていのプロジェクトは成功する
・・・夢を見た

314 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 18:14:01 ]
>>308
そもそもhaskellにはオブジェクト指向は不要なんですよ。
というのも、関数の再利用できる範囲がCやらjavaやらとは桁違いに大きいのが特徴だからです。


315 名前:デフォルトの名無しさん [2007/12/13(木) 21:20:25 ]
Haskellでモジュールつかってカプセル化してコード書いている人あまりいないような気がするんだけど気のせいかな。


316 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 21:22:03 ]
なにを根拠に?

317 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 21:35:09 ]
>>315
そもそもhaskellを使って実用アプリを公開してる人があんまりいないんだから
仕方ないだろ。

318 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 22:49:47 ]
Haskellって関数型言語の勉強用じゃないの?

319 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 23:10:30 ]
それだけのための言語だとどうして思うのですか?

320 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 00:39:15 ]
GHC 6.8.2が出てるね。
GHCiの機能追加がメインっぽい。



321 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 00:53:25 ]
HaskellはOOじゃなくて、
generic programing指向だからなあ。
Genericsの世界では最強認定を受けてる。

322 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 01:21:07 ]
OfficeがHaskellで書きなおされるまで俺はその有用性を認めない。

323 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 02:29:17 ]
スケーリングのための言語じゃないんだよな
工場制手工業ならOOであることやポピュラリティ(みんなが使ってること)は必須だ。

324 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 13:26:48 ]
別に必須じゃないし。
今流行ってること取り入れたってどうせちぐはぐになるだけ。

325 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 13:28:05 ]
っていうかさ、人海戦術の奴隷商売に慣れすぎていて、理性的な考え方を失ったお猿さんですか?

326 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 14:15:06 ]
ポピュラリティが必須というのは分かるけど、OOが必須というのはおかしくね?
OOは一手法に過ぎないんだから、もっと良いものが知られればそっちが使われるようになるだろ

327 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 14:21:57 ]
OOは現時点でのポピュラリティの1つって事ならわからなくもないけど、
わざわざ分けて必須って言うほどのものではないな。

328 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 14:54:59 ]
つーか、OOはstableなlibrary構築にはいいんだけど、
意外とreusabilityが悪いから、
generic programmingが注目されているのが現状です。
Haskellのtype classとかC++のconceptみたいなやつ。

C++はtemplate/traitsでやってましたが、ちょっと非力なので、
Haskellのtype classそっくりの"concept"が入る事になりました。


329 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 14:59:18 ]
実際これはOOと比べてどうなんだとか思ってたんだけど
実際使ってみたら意外とオブジェクト指向のメリット包含しててSUGEEとか思った

330 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 14:59:57 ]
>>328
日本語でおk



331 名前:328 mailto:sage [2007/12/14(金) 15:35:51 ]
日本語ですよ?

332 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 15:45:42 ]
決して英語が読めないわけではないが、
不自然だ
読みにくい
目が痛い

333 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 16:23:51 ]
理論はそのとおりなんだが、残念だがそんな理論を理解出来る人間は少数派なんだよ。
共産主義みたいなもん。高尚な理屈よりも明日パンが、今日のバグを潰せるかが問題なわけだ。

いいじゃない。Haskellは芸術的な小物を個人で作るのに向いてるってことで。



334 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 17:07:50 ]
>>333
多数のバカよりも少数の優秀な人間でプログラミングしたほうが安く早くできます。

335 名前:328 mailto:sage [2007/12/14(金) 17:08:28 ]
>>332
そういう意味か。すまん

>>328については、
journals.cambridge.org/action/displayAbstract?fromPage=online&aid=715036
で。探せばピィーディーエフも見つかるようです。

336 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 17:09:42 ]
>>333
どの辺の理論のことを言ってるの?

337 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 17:10:46 ]
>>335
不自然だ
読みにくい
目が痛い

お前は日本語文書の常識を勉強したほうがよさそうだな

338 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 17:16:49 ]
どっちにしろ、今みたいに人気がなくて、そのせいでライブラリも
周辺環境も整っていない状況だと、小物を個人で作るのすら満足にできん。

339 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 17:43:43 ]
wxhaskellが使いやすい
が、6.8系用が出てない・・6.6系は非公式

340 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 17:52:21 ]
いまだと.NETやJavaVMに乗せちゃえばライブラリ不足は一挙に解決だな。



341 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 17:56:18 ]
>>339
普通にdarcs版をビルドできないか?

342 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 17:56:46 ]
>>340
なんで?

343 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 19:53:13 ]
conceptの導入をもってHaskellはC++のサブセットになります
つまりこれで全ての言語がC++のサブセットになるというわけです

344 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 20:54:45 ]
本日をもってHaskellはウジ虫を卒業する
本日からHaskellはC++のサブセットである
兄弟の絆に結ばれる
Haskellのくたばるその日まで
どこにいようとC++は貴様らの兄弟だ
多くはベトナムへ向かう
ある者は二度と戻らない
だが肝に銘じておけ
C++は死ぬ
死ぬために我々は存在する
だがC++は永遠である
つまり―――Haskellも永遠である!

345 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 07:46:00 ]
初心者質問です。

test = flip fun1 . fun2

の場合、

1. test = flip (fun1 . fun2)

2. test = flip (fun1) . fun2

どっちの意味なんでしょうか。(.)が使用されている場合、flipが対象とする
関数がどこまでかかるか分かんなくなってしまいました。

346 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 08:05:18 ]
(.)よりも関数適用のほうが優先度が高いから答えは一応 2.なんだけど、
括弧の付け方としては (flip fun1) . fun2 のほうが正しい。

347 名前:345 mailto:sage [2007/12/15(土) 14:13:25 ]
>>346
ありがとうございます。合成関数全体にかかるのかと思ってました。
もう少しいいでしょうか。

ja.doukaku.org/comment/4621/

にある、

attachIndex = map (uncurry (flip zipWith [0..] . ((,) .) . flip (,))) . zip [0..]

がよく理解できないのですが、

(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"

の部分は

zipWith (((,) .) $ flip (,) 0) [0..] "abc"

と考えられると思うのですが、何ででしょうか。(flip zipWith [0..] . ((,) .) . flip (,)) の
第一引数"0"がまず部分適応されてflipされるところが理解できません。


348 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 14:41:26 ]
(flip zipWith [0..] . ((,) .) . flip (,)) 0
から始める。まずこの式は(A . B . C) 0という形だからA (B $ C 0)に直せて、
flip zipWith [0..] ( ((,) .) $ flip (,) 0 )
これはflip A B Cという形だからA C Bと書き換えられて、
zipWith ( ((,) .) $ flip (,) 0) [0..]

349 名前:345 mailto:sage [2007/12/15(土) 15:29:30 ]
>>348
ありがとうございます。しかし、まだちょっと理解できませんw

1.第一引数"0"の部分適応を行う
2.flip する

の順番の根拠がよく分かりません。

(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"

の第二引数が最後に適応されるのは何故でしょうか。

あと、これは変な質問なんですけど、

(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"

の形を慣れた方は直接記述できちゃうんでしょうか。それとも、

zipWith ( ((,) .) $ flip (,) 0) [0..] "abc"

の形から変形させていく形でプログラム書いていくんでしょうか。


350 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 15:37:45 ]
>>349
Haskellでは基本的にどんな順番で簡約しても結果は同じだから、分かりやすい順序でやっただけ。
もっと実装に即した順序でやることもできるけど、面倒なだけな気がする。

>の形を慣れた方は直接記述できちゃうんでしょうか。
俺はできない。読むのも二分くらい掛かった。



351 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 15:42:07 ]
あ、でもそのnobsunという人は日常的にそういうコードを書いてるみたいだから、
たぶんすらすら書けるんだろう。

352 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 15:46:11 ]
俺思うんだけどさ、デザインパターン中毒みたいにポイントフリー中毒ってあるんじゃないかなあ。
そーいうのって可読性犠牲にしてまでやるものなのか?

353 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 15:47:28 ]
>>350
> Haskellでは基本的にどんな順番で簡約しても結果は同じだから、分かりやすい順序でやっただけ。

(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"

自分がどうも腑に落ちないのは、どうして

zipWith ( ((,) .) $ flip (,) 0 "abc") [0..]

こうじゃないんだろう?ってとこなんですね。もちろん、こういう解釈だとダメなんですけど、
引数一つだけ取って、ある関数を返してから、次に行くってのがルールだったりするのかな、
と思ったのですが。

> 俺はできない。読むのも二分くらい掛かった。

そうですかw。いや、直感的に書ける人って凄いなぁって思ったんですが、なかなか
そういう人はいないんでしょうかね。

354 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 16:02:39 ]
>>352
デザインパターン中毒はどうか知らんが、この書きかたには
記述が簡潔になるという利点があるんだから、別にいいんじゃないかと思う。

>>353
Haskellの関数は常に一引数関数で、多引数関数は
カリー化でエミュレートされているだけだということを思い出すべし。
(.)も両辺を一引数関数として合成するから、
(f . g) a b

f (g a b)
は等しくない。

355 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 16:05:04 ]
些細なことだけど
> (f . g) a b
この括弧なんとかならないかな

356 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 16:13:51 ]
>>354
> Haskellの関数は常に一引数関数で、多引数関数は
> カリー化でエミュレートされているだけだということを思い出すべし。

そうでしたw。

いやぁ、ありがとうございます。スッキリしました。

357 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 16:36:06 ]
>>355
>219に戻れ

358 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 16:43:36 ]
>>357
>>219とは趣旨が違う
> (f . g) a b
この括弧はうっとうしいなぁと言ってるだけなんだよ。
$みたいに括弧省略したい

359 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 17:10:55 ]
俺はその格好が好きだ

360 名前:デフォルトの名無しさん [2007/12/15(土) 17:31:40 ]
ML でも (foo o bar o baz o foobar) quux みたいに書くね



361 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 20:25:33 ]
>>358
お前は何を言っているんだ

362 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 21:14:46 ]
>>361
心で感じろ

363 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 01:37:28 ]
>>361
風を感じろ

364 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 01:45:32 ]
GHC 6.8.2 Windows版で、コンソールのコードページが英語のになるバグがようやく直ったな。

365 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 20:36:29 ]
Parallel Haskellの拡張されてる点ってどんなとこ?

366 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 08:39:00 ]
>>364
太字になるのは?

367 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 09:27:14 ]
WindowsでGHCなんか使うやつはバカです

368 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 11:39:39 ]
同感

369 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 11:47:31 ]
windowsではGHC以外に何が一番いいの?

370 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 16:08:40 ]
>>365
(疎結合の)クラスタ範囲にまで並列化する
(普通のマルチコア・マルチCPU(どっちも共有メモリ)範囲の(半)自動並列化ならGHC本体だけでもできる)
そんなハード持ってなければどっちみち関係ない



371 名前:デフォルトの名無しさん [2007/12/17(月) 22:55:51 ]
        ____
       /      \
      /  ─    ─\     今年もあと一ヶ月だお・・・
    /    (●)  (●) \
    |       (__人__)    | ________
     \        ̄    ./ .| |          |
    ノ           \ | |          |
  /´                 | |          |
 |    l                | |          |
 ヽ    -一ー_~、⌒)^),-、   | |_________|
  ヽ ____,ノγ⌒ヽ)ニニ- ̄   | |  |




      / ̄ ̄ ̄\
    / ─    ─ \
   /  (●)  (●)  \.  俺はこの一年間何をしていたんだろう
   |    (__人__)    | 2chで浪費した莫大な時間を何か有意義なことに使っていたら・・・
   \    ` ⌒´    /
   /           \

372 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 23:18:53 ]
このスレは相当に有意義だと思うんだけどな。
つうか基本的に専門スレしか見ない人も多いと思うんだが。
今年も大変勉強になりました。

373 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 18:46:23 ]
いまさらだが、

>>96
JavaScriptでもできるな

374 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:49:40 ]
(>>=´∀`)

375 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:20:06 ]
そこで具体的な事じゃなく漠然と「有意義な事」って言葉しか出ないなら
2ちゃんやらなくても結果は一緒だったと思うんだよ

376 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:04:51 ]
日頃から頑迷そうな意見乙

377 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 12:55:59 ]
哲板から転載
読んだ人いる?

圏論による論理学 高階論理とトポス

清水 義夫
ISBN978-4-13-012057-9,
発売日:2007年12月中旬,
判型:A5, 232頁


内容紹介
20世紀後半,数学,計算機科学,論理学などの分野で採用されてきている圏論.
関数概念を基本として現象をとらえようというこの方法を,
関数型高階論理とトポスを題材にして丁寧に解説する.
論理学の観点を中心に,圏論の考え方を紹介するテキスト.



主要目次

第1章 関数型高階論理
第2章 トポス
第3章 トポスの基本定理
第4章 プルバック関手f *の右-随伴関与Πf
第5章 リミット、空間性トポス、限定記号
結び
付録1 A∧( ) ┤A⊃( )のイメージ的理解
付録2 各章の課題
主な記号一覧/索引


378 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 12:57:43 ]
>>377
立ち読みしたが、俺らには全く関係ないよ

379 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 12:59:29 ]
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●不合格●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
これを見た人は確実に【不合格】です。これをコピペでどこかに1回貼れば回避できます。
これは本当です。やらないと一年無駄になります.

私も最初は嘘だと思ったんですが、一応コピペしました。それで第一志望に合格出来ました。
けどコピペしなかった友達がA判定とっていたのに、おちたんです。(慶応合格h.sさん)

俺はもうE判定で記念受験だったんだけど、コピペを10回くらいした途端に過去問が
スラスラ解けるようになって、なんと念願の開成に受かりました。(開成合格r.kくん)

これを今年の試験前に見てシカトしたら、入試でミスって最悪です。(n.aさん)

380 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 16:34:29 ]
tasukete



381 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 16:37:43 ]
>>380
通報しますた

382 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 08:38:38 ]
>>378
関係ないことないだろ。
Haskellの型システムを理論的に理解する時など。

383 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 08:51:28 ]
しみろん、懐かしいな…

384 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 11:43:56 ]
すげー久しぶりに しみろん 見た…

385 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 19:57:10 ]
liftM と fmap が一致しない場合ってあるの?

386 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:11:49 ]
>383-384
東大OB乙

387 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 18:50:21 ]
二ヶ月ほど前に撮った写真です
場所はバトルロワイヤルの撮影地にもなった
軍艦島での一枚です。
www.uploda.net/cgi/uploader1/index.php?file_id=0000278909.bmp
撮影し現像した物を
心霊写真がないかな〜っと面白半分で探していると
偶然にも一枚だけ物凄い写真が在りました
最初に見えたのは右下の子供の様な顔です
左にはボーっと立ち尽くし
こっちを見ている子供がうっすらと写っています
上部には青白い叫び顔があります
それだけではありません
探せば探すほど気持ち悪い顔があるのです
私は現在で約30ほどの顔を見つけました、全てこっちを見ています
探せば探すほどあまりにも出てくるので
気持ち悪くなり頭が痛くなりました
この写真ですが、ある友人に貸した所
夜に1時間程笑い声の様なものが聞こえてかなり
怖かったらしいです・・・
霊感がある方はぜひ鑑定をお願い致します。

因みに、スキャナーで高画質でスキャンした上で
見易いように画質調整をしています
ですのでファイルサイズが9MBにもなります・・・

388 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 21:23:54 ]
>>387
スレ違い

画像処理 その10
pc11.2ch.net/test/read.cgi/tech/1197759782/

389 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 00:40:56 ]
ワロタ

390 名前:デフォルトの名無しさん [2007/12/31(月) 18:01:51 ]
初心者レスです。
既出や意味不明な質問でしたらすみません。

ポイントフリースタイルって言葉がありますよね。
仮引数を無くして、関数を関数だけで定義するという意味で。

firstNLines n cs = (unlines . take n . lines) cs

上のような関数が定義されていたとして、
仮引数を減らす仮定で

firstNLines n = unlines . take n . lines

上のように書けますよね。
更に仮引数 n を無くす場合

firstNLines = (. lines) . (unlines .) . take

と書けると思うんですが
ポイントフリースタイルとなった最後の定義式を見て
理解しやすくなったとは思えないのです。
積極的に使うべきなのでしょうか。



391 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:07:32 ]
わかりやすいほうでいいんじゃない?
ごちゃごちゃしてるのがいやならポイントフリーで。

392 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:15:14 ]
なんでもポイントフリーにするのは難読化への道を歩んでしまいかねん。
とりあえず二つ目のfirstNLines nみたいに普通に使ううちは
型を明示してれば分かりにくくなることも無いけど、
度を過ぎた奴はコードの修正とかも考えると扱いにくいわ読みにくいわでいろいろと面倒だし、
ポイントフリースタイルが時にはポイントレス(要領の悪い)スタイルといわれることもある

ってHaskellWikiに書いてた
俺もflipとかドットとか使いまくったコードを読むのは嫌い。
でも書いてる奴からするとパズルみたいで楽しいんだろうなあ、とか。

393 名前:389 mailto:sage [2007/12/31(月) 19:29:48 ]
ポイントレススタイル・・・。
書くときは頭の体操になるかもしれませんが
読む方からすると大変ですよね。

394 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 21:34:10 ]
ポイントフリースタイルにすると点 . がどんどん増えてぜんぜんポイントフリーじゃないよ(笑

395 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:03:28 ]
map ($ 3) [(+1),((-)2),(/3),(*4)] とか書くと単純なことなのになんか愉快だよね、たしかに

396 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:38:55 ]
なんだその記号だらけの読みにくい奇怪なコードは

397 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:16:55 ]
あけましておめでとうございます。
今年は Haskeller になれるように頑張りまふ(`・ω・´)!!

398 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 10:27:49 ]
俺もだ!
今年こそはHaskellマスターになる

399 名前:デフォルトの名無しさん [2008/01/01(火) 11:08:26 ]
>>395
少し愉快になれた(゚∀゚)

400 名前:デフォルトの名無しさん [2008/01/01(火) 17:35:39 ]
今更だけど
>>52
の説明に感動した。



401 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:08:19 ]
>>394
ポイントって確か関数合成演算子じゃなくて「値」のことだったかと
まあそれを踏まえて言ってるのかもしれないけど

402 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:26:20 ]
モナド難しいよ。
みんなエディタは何使ってる?
Emacs が多いのかな。

403 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:50:16 ]
現状まともにプログラミングできる環境がemacsしかない
eclipseは使いづらいし、xyzzyのhaskell-modeはバグだらけだしwindowsでしか動かないし。

404 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:52:19 ]
>>402
モナドなんてHaskellではただのデータ型なんだから、別に難しいことなんかないよ。

405 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 09:01:44 ]
>>403
vim にもあるでしょ?俺は vim 使ってるよ

406 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 11:04:47 ]
俺は、viはほとんど使えないんだ。
設定ファイルをちょこっと編集するぐらいなら使うが、深い使い方は覚えてない。

407 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 15:34:50 ]
>>401
ここに由来が書いてあります。
www.haskell.org/haskellwiki/Pointfree

408 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 17:39:13 ]
darcs2って今までのdarcsとどう違うの

haskellの組み込み言語atomを詳しくおしえて

409 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:22:16 ]
関数型初心者です。

今、SICPを少しずつ読んでるのですが、set!のようなものをHaskellがモナド化するのは
単に純粋であることに拘るからでしょうか。IORefみたいなものがset!に当たるかと思います
が、副作用アリだぞ、ということを意識させる以上のメリットとかがよく分かりません。



410 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:10:23 ]
>>409
プログラマに直接メリットはない。

メリットは最適化コンパイラを作るのが楽になること。



411 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 04:05:03 ]
関数型言語をやる人の多くは、学生も含め研究者です。
研究テーマはプログラミング言語の中でも、
意味論やプログラム解析などが多く、
そういう研究では参照の透明性が非常に有益な性質です。

たとえば、Javaで盛んに研究されているエスケープ解析も、
初期の成果では、関数型言語で行われたものが多いです。

また参照の透明性を保つことは、実務プログラマにとっても大変有益で、
プログラムの簡明さを保つことにつながります。
良く理解すれば、他の言語でも使える一つの方法論を得たことになります。

412 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 04:32:28 ]
C99のコンパイラ作ってくれ。

413 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 04:33:24 ]
インタープリタで頼む。CなのにGCがオプションであったりとか。

414 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 08:18:04 ]
CINTがあるじゃないか

現状どうなってるか全く知らないけど

415 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 09:06:52 ]
>>410-411
そんな小難しい話しなくても、評価順の決まっていない言語で副作用を使うのが
どれだけ厄介か考えれば済むことじゃないか?

416 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 09:42:37 ]
>>409
確かに純粋であることに拘っているからという点は大きい。
しかし、それだけではなく、例えば、
Haskellではリストを使ったプログラムを書いている途中でそれを非決定性計算と
みなしてプログラムの一部を書くとか、IOに限らずモナドを気軽に使う人もいる。
そのためモナド一般を扱う便利関数(mapMとかモナド変換子とか)が多く用意されている。
IOがモナドになっているとそういった便利関数が使えるので便利。


また、モナドになっていると読みやすさのためにコードをまとめたり
移動させたりといった操作が気軽にできる。
例えば副作用のある言語で

f x = x + y + (副作用のある式)
where
y = (副作用のある式)

とかやるとどの順番で副作用が現れるかとか、yはどのタイミングで
何回評価されるのかわからない。
Haskellであればそのような問題はないので気軽にwhereにコードを
まとめたりできる。


417 名前:409 mailto:sage [2008/01/12(土) 11:02:27 ]
皆さん、ご回答ありがとうございます。

>>415
そうなんですが、モナドはdo記法が可能で、これは実質手続き型の
記述ですよね。手続き型の記述が関数型言語内で可能だから、IOが
モナドになっていると思うのです。

>>416
モナド自体は演算のリレーということで分かるんですが、副作用の発生
する式をそうする理由は、上に書いたように、単に順番が保証されるのが
モナドである、という以上の理由は無い気がします。

どちらかというと、>>410さんの書いていることがメインなのでしょうかね。




418 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 12:10:33 ]
モナドのおかげで、
CやSchemeよりコンパイラの最適化がより進むって事はないんで、
そこのところは誤解しないように。

参照の透明性から、プログラム変換しやすくなるので、
コンパイラの研究がやりやすいってだけ。


419 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 12:10:54 ]
>>417
>単に順番が保証されるのがモナドである
違う。遅延処理ではg . f(x)でf → gと簡約されるかどうかがわからないのと同じように
¥x -> mf >>= mg でmf → mgと簡約されるかどうかはわからない。

モナド自体には「計算のリレー」の意味はあるけど「順番に実行する」意味はない。
IOモナドみたいな奴は、計算のリレーが示すその一連のIOアクションがmainに渡されたときに
(遅延しないHaskell処理系が)順番に実行することで「順次実行」を実現している。

IOがモナドになっているのは「計算がリレーの形になっている」ことを保障させるためだけ。

UnsafeInterleaveIOはIOモナドから出してすぐ入れるだけの処理だけどIOアクションが遅延するようになる。
これは計算のリレーを途中で切断したからその部分だけ順次実行できなくなったんだね。
これを使ってる関数にはgetContentsやinterleaveとかがある。


420 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 14:57:58 ]
前に読んだことがある論文で、
HaskellのIOの実装に関する論文なんだが、
タイトルを忘れてしまった。
それらしい論文のタイトルを挙げてくれませんか?



421 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 15:08:02 ]
俺はsimonpjのこれが面白かった。
Tackling the awkward squad:
monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell
research.microsoft.com/%7Esimonpj/Papers/marktoberdorf/mark.pdf

422 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 17:23:16 ]
>>421
これだこれだ
ありがとう

423 名前:421 mailto:sage [2008/01/12(土) 18:09:21 ]
うぉー、一発的中!
ご褒美に最近読んで面白かったHaskell論文のタイトルくれ

424 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:35:49 ]
web.yl.is.s.u-tokyo.ac.jp/~ganat/memo/aboutHaskell.html
これに書かれてる、
> Ericssonによる 電話のソフトウェアを用いた一連の実験によれば、9から25倍の向上が 見られました
の部分の根拠となる論文って何?

425 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 12:27:39 ]
2組のタプルの値を交換する関数って
標準でありますか?

exTuple (x,y) = (y,x)

みたいな感じの。無いならいいんですが・・・。

426 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:26:01 ]
無いと思う。強いて言えばuncurry (flip (,))だけど。

427 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:39:28 ]
なるほど uncurry ですか。
flip (,) までは考えてたんですが

ありがとうございます。

428 名前:デフォルトの名無しさん [2008/01/14(月) 15:15:28 ]
十進数 (e.g. [1,2]) を二進数 (e.g. [1,1,0,0]) に変換するプログラムを,
foldl を用いて書け,という問題を連休中ずっと考えてるんですが,
脳味噌が手続き型で凝り固まっていてさっぱりわかりません.

どうやって書くのか教えて頂けませんか.

429 名前:デフォルトの名無しさん [2008/01/14(月) 15:19:02 ]
手続き的になら書けるの?

430 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 15:26:32 ]
教科書的に書こうとしてみたが、こんなんでいいか?
import List

-- n進数表示から整数へ
fromBaseN :: Integer -> [Integer] -> Integer
fromBaseN n ds = foldl f 0 ds
  where
    f acc d = n * acc + d

-- 整数からn進数表示へ
toBaseN :: Integer -> Integer -> [Integer]
toBaseN n 0 = [0]
toBaseN n x = reverse $ unfoldr f x
  where
    f 0 = Nothing
    f x = Just (mod x n, div x n)

-- 十進数から二進数へ
decToBin :: [Integer] -> [Integer]
decToBin = toBaseN 2 . fromBaseN 10



431 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 15:30:33 ]
>>430
教科書的なら一発でできる方法があるはずだ

432 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 20:10:49 ]
>>431
mjd?

433 名前:デフォルトの名無しさん [2008/01/14(月) 20:36:34 ]
ghc6.6のころはSystem.Console.Readlineってデフォルトではいってましたよね?
当方Windowsなんですが、
久しぶりにHaskellやろうと思って6.8.2をインストールしたんだけどSystem.Console.Readlineがない・・
一年くらい前につくったインタプリタがビルドできないっす;;
にわかなのでライブラリインストールもままならないのですが、cabal-installってWindowsでも使えますでしょうか?

434 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 21:05:11 ]
n進数→十進数をfoldlでやるならわかるけど
その逆は思いつかんなあ

435 名前:デフォルトの名無しさん [2008/01/14(月) 22:12:17 ]
なつめって初めて知ったけど、こんな所にも Haskell を使ってる人が居るとは面白い

natume.sourceforge.jp/

436 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:17:04 ]
重すぎて使い物にならないけどな

437 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:29:35 ]
>>433
Haskellプログラム書くならHaskell98に準拠しないと互換性なくなるぜ?

438 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:30:28 ]
どなたか>>424の質問の返答をおねがいします

439 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 03:18:49 ]
>>430
428 では無いんだが

Just (mod x n, div x n)

ここって modDiv 使った方が速いのか?
そうすると >>425 みたいなのを使うべき?

440 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 03:19:50 ]
modDiv -> divMod
だった。ごめん。



441 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 00:40:44 ]
>>439
divMod 使う方が速いんじゃないかな。
かといって>>425は読みにくいから
Just (r,q) where (q,r) = divMod x n
でいいんじゃない。

442 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 06:56:19 ]
なるほど、サンクス。

443 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 11:52:42 ]
数が小さいと分かっている時: (なおかつ実行効率が必要なら)
modとdivの計算コストは小さいから、
タプルを消費しないように書いた方がいい。

444 名前:430 mailto:sage [2008/01/16(水) 13:48:57 ]
実行効率なんて全然考えてなかったよ
とりあえず実測してみた。ghc-6.8.2 -O2、入力はrandomRIO (0, 2^16)で

19.6 19.2 toBaseN
14.2 14.6 toBaseN_where
12.6 13.1 toBaseN_loop
8.6 10.8 toBaseN_case
7.9 7.0 toBaseN_loop_case

左から、%time、%alloc、関数名。_whereは>>441のやりかた。_caseはwhere節の代わりにcase式を使ったもの
_loopはreverse+unfoldrの代わりに手でループ(末尾再帰)を書いたもの
総実行時間の約1/4がGCだった

数が小さくてもdivとmodのコストが大きいな

445 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 17:30:40 ]
無知でスマソ
末尾再帰ってことは $! を使ってるってこと?
良ければソースを見せて貰えませんか。

446 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 19:00:45 ]
>>445
なぜか$!に慣れないのでseqを使ってるけど

toBaseN_loop_case :: Integer -> Integer -> [Integer]
toBaseN_loop_case n 0 = [0]
toBaseN_loop_case n x = f x []
  where
    f 0 ds = ds
    f x ds = case divMod x n of
      (r, q) -> f r (q:ds)

toBaseN_loop :: Integer -> Integer -> [Integer]
toBaseN_loop n 0 = [0]
toBaseN_loop n x = f x []
  where
    f 0 ds = ds
    f x ds = let q = div x n; r = div x n in
      q `seq` r `seq` f r (q:ds)

447 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 19:22:34 ]
今気付いたけど、toBaseN_loopのdivは片方modじゃないといかんな
そういうわけで>>444の結果は間違ってる

448 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 19:16:16 ]
たかだか有限時間で終わる処理について実行効率など考える必要はない

449 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 19:17:04 ]
神様キター!

450 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 21:31:07 ]
>>448
人間が不快に感じるかどうかなんて些細な問題だよな



451 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 22:19:48 ]
だったら数学やっててくれ。

452 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 00:05:36 ]
>>448
512ビットの素因数分解だって有限時間でできますよ。

453 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 03:21:02 ]
>>448
お前の人生も有限時間で終わるぜ

454 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 10:02:31 ]
この宇宙は有限時間で終わりますか?

455 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 18:40:07 ]
どなたか
State モナドの使い方を
教えて貰えませんか?

456 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 18:58:23 ]
使いどころが知りたいのか書きかたが知りたいのか

457 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:20:13 ]
>>455
例が腐るほどWEB上にあるだろ
検索してみろよ

458 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:22:47 ]
使いどころです。

459 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:34:18 ]
>>458
入門書に載ってた例だけど、

・文字列を要素とする二分木が与えられたとき、その要素を整数に置換した木を得たい。
ただし同じ文字列は同じ整数に対応させること。例えば、


460 名前:459 mailto:sage [2008/01/19(土) 19:40:19 ]
途中送信御免

例えば、
(("hoge") "hage" (("fuga") "hage" ("fuga")))
という木なら
((0) 1 ((2) 1 (2)))
にする。

手続き型言語なら、実行した置換を記録しながら木を左から走査していけば良いわけだが、
Stateモナドを使えばHaskellでも同様に書ける。逆にStateモナドを使わずに写像を引き回すのは面倒。



461 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:49:50 ]
広範囲で変数を持ちまわるのに
普通の言語ではグローバル変数とかインスタンス変数に書き込んだりするけど、
そんなどこで変更されるかわからないようなアブナイことしなくても
(a,s) -> (b,s)の形で持ちまわればいいよね、ってのがStateモナドなんだから、
普通は変数を使う処理を考えればおのずから例はでてくるんじゃないか?

462 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 08:17:57 ]
>>461
「普通は変数を使う処理」の大部分はHaskellでStateモナドを使わずに綺麗に書ける。
だから混乱するんだと思うが。

463 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 19:37:59 ]
>>460
禿言うなヽ(`Д´)ノ

464 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:55:16 ]
>>460
hageにも人権をヽ(`Д´)ノ

465 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 10:36:58 ]
(("nukege") "usuge" (("fuga") "usuge" ("fuga")))

466 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 15:17:31 ]
オセロとか将棋とかの盤面のデータ構造についていつも迷うんだが、
いったいどういうデータ構造にするのが一番効率がいいのかね
2次元リストとか、Mapとか、いろいろあると思うが・・・

467 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 15:44:00 ]
>>466
よく使われるのは1次元配列とbit board

468 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 12:50:26 ]
ByteStringでのParsec実装が欲しいっす。

469 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 19:11:50 ]
そういえばParsecがどうやって実装されてるか知らない
ソース見てみたけど何か難しそうだ

470 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:03:19 ]
普通にモナドじゃないの?



471 名前:デフォルトの名無しさん [2008/01/29(火) 13:51:05 ]
log4*的なロガーライブラリってないでしょうか?

472 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:58:35 ]
>>471
実際に使ったことはないけど
つttp://hackage.haskell.org/packages/archive/pkg-list.html#cat:Interfaces

473 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 14:11:30 ]
>>472
おお!ありがとうございます。
試してみます

474 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:37:30 ]
質問です。

C言語で
int hoge(void) {
int x,i;
for(x=0, i=0; i<100000; i++) {
x=x+i;
}
return x;
}
をHaskellで書く場合は再帰で書くほうが良いのか、foldlで書くほうが良いのか分かりません。
他にも書き方があるかもしれませんが、一番メジャーなループの書き方を教えてください。

475 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:03:59 ]
まるで最低一種類は自力で書けるかのような言い方だな

476 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:09:44 ]
どんな場合にも一番いい方法が存在するかのような言い方だな

477 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:16:33 ]
>>474
俺は、再帰でない書き方をすぐに思い付かなかったときだけ再帰を使ってる
その例なら迷わずsum [0..100000]だな

478 名前:474 mailto:sage [2008/01/30(水) 16:19:09 ]
>>477
ありがとうございます。
その場合、リストはどのように処理されるのでしょう?
つまり、1000番目の要素を足しているときに、999番以下の要素はもはや必要ないわけですけれど、
sum関数が終了するまでメモリに記憶されているのでしょうか?

479 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:29:10 ]
>>478
どこからも参照されていないから、いつでもGCされうる状態
実際にメモリ上に残っているかどうかはGCのタイミング次第

480 名前:474 mailto:sage [2008/01/30(水) 16:34:17 ]
>>479
ありがとうございます。
では逆に1000番目の要素を足しているときに、1001番目の要素はすでに生成されているのでしょうか?
足す直前に生成されるのでしょうか?



481 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:50:17 ]
>>480
> 1001番目の要素
とはどういうものを意識してる?具体的にkwsk

482 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:52:05 ]
>>480
処理系と最適化オプションに依る

素朴な遅延評価だと前者
sum [0..100000]
==> foldl (+) 0 [0..100000]
==> foldl (+) 0 (0:[0+1..100000])
==> foldl (+) (0+0) [0+1..100000]
==> foldl (+) (0+0) (1:[1+1..100000])
==> foldl (+) (0+0+1) [1+1..100000]

==> foldl (+) (0+0+1+2+...+100000) []
==> 0+0+1+2+...+100000


だけど、例えばghc-6.8.2で-O2だと、Integer用に特殊化されたsumの実装が使われて、
foldlの蓄積引数が積極評価されるので後者になる

483 名前:482 mailto:sage [2008/01/30(水) 17:08:24 ]
分りにくい気がしたので補足

どっちの評価順でも、リスト生成は遅延される
ただし、素朴に遅延評価をやると足し算まで遅延するので、結果としてリストを走査し終わるまで足し算を開始できない
GHCの最適化は足し算を遅延させないようにするもの

484 名前:474 mailto:sage [2008/01/30(水) 17:08:53 ]
>>482
ありがとうございます。
とても参考になりました。

485 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 17:56:59 ]
イータ簡約って奴でしょ。
www.lambda-bound.com/book/lambdacalc/node21.html

486 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 18:22:54 ]
質問です。

sourceforge.net/project/showfiles.php?group_id=168626
で6.8.1用のwxHaskellをダウンロードしてインストールし、
Windows XPでwxHaskellのサンプル(Minimal.hs)を
ghc --make Minimal.hs
としてコンパイルしてみたのですが、
出来上がったMinimal.exeをエクスプローラからダブルクリックで実行すると
目的のウインドウとコマンドプロンプトのウインドウの両方が表示されてしまいます。
コマンドプロンプトのウインドウはとても邪魔なのですが、
これが表示しないようにするにはどうすればよいのでしょうか?
さらに、実行ファイルを配布する際にDLLを付属するのは格好が悪いので、
DLLを使わないコンパイル方法はないものでしょうか?

487 名前:486 mailto:sage [2008/01/30(水) 18:29:59 ]
前者の問題は過去スレを検索して解決できました。
コンパイルオプションに-optl-mwindowsをつければよいのですね。
早とちりしてすみません。

後者の方はまだ解決していません。

488 名前:486 mailto:sage [2008/01/30(水) 19:01:48 ]
ファイルがめちゃくちゃでかくなると思っていろいろ調べたのですが、

e.tir.jp/wiliki?hdn
> よく読んだら、「余分なデータの削除なるオプションで500KB弱になった」と書いてある。それらしいオプションは……
>
> --overlay=strip strip any extra data attached to the file [DANGEROUS]
>
> なんか、「DANGEROUS」って書いてあるんだが。

とありますが、ghc6.8.1ではそのオプションは削除されています。

e.tir.jp/wiliki?hdn
> stripと言えば、binutils付属のstripコマンドもあった。
> ...
> strip -s hsddd01.exe
> 2.3Mが1.1Mになった。バイナリの半分以上がシンボルでできていたのか……。

この方法はマニュアルの
www.haskell.org/ghc/docs/latest/html/users_guide/smaller.html
に言及されていました。

-funfolding-use-threshold0
というオプションをMinimal.hsのコンパイル時につけると逆に若干ファイルサイズが増えました。

489 名前:デフォルトの名無しさん [2008/01/31(木) 12:20:45 ]
GHC6.8.2(Win)でbytestring-0.9.0.4をつかって
-profフラグ付でコンパイルしようとすると

Perhaps you haven't installed the profiling libraries for package bytestring-0.9.0.4?

と出て失敗してしまいます。(profフラグをつけなければ成功します)
対処方ご存知の方いらっしゃいますか?

つか、ByteStringに変更してさらに遅くなった俺涙目

490 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 17:57:26 ]
>>488
その--overlay=stripはupxのオプションだろ

>>489
そのbytestringパッケージはどうやってインストールした?
cabalなら、configureのときに-pオプションを付けないとプロファイル版ライブラリがインストールされない



491 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 02:37:31 ]
質問です。

windows上でファイルのアンロックを明示的に行うにはどうすればよいのでしょうか?
ロックがかかったままのファイルに書き込みする必要があるのです。

492 名前:489 mailto:sage [2008/02/01(金) 12:44:40 ]
>>490
なるほど、ありがとうございます。
-p付でインストールしなおしてみます。

493 名前:デフォルトの名無しさん [2008/02/03(日) 17:41:55 ]
% cat hello.hs
main = putStrLn "こんにちは、世界!"

% ghc hello.hs -o hello
% ./hello
...... ←[ここは文字化け]

UTF-8でソースを書いて、コンパイル&実行したのですが、
文字化けします。

ver6.6.1(Ubuntu7.10のバイナリパッケージを使用)なのですが、
UTF-8は使えないのでしょうか?
コンパイルオプションが必要ですか?

494 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:05:27 ]
>>493
>>5-6参照

495 名前:492 mailto:sage [2008/02/03(日) 18:44:28 ]
>>493
どうもありがとうございます。
調べてみます。

496 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:46:49 ]
>>469
ふつケルの終わりのほうに超簡易Parsec実装の解説がある。

497 名前:デフォルトの名無しさん [2008/02/05(火) 12:00:00 ]
do記法がどのように(>>=)変換されているのかがよくわからないです。
たとえば
do { a <- return 1; Just 2 }

return 1 >>= (\a -> Just2)
なのはぎりぎりわかったような感じですが
3つ以上
do { a <- return 1; Just 2; return a }
だとどうなるのでしょうか?

498 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:13:23 ]
仕様を読めれば仕様を読むのが一番早い

499 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:29:01 ]
>>497
最初の一つだけ変換する
return 1 >>= (\a -> do Just 2; return a)
残ったdoも同じ規則で変換すれば良い。最終的には、
return 1 >>= \a -> Just 2 >> return a

500 名前:497 mailto:sage [2008/02/05(火) 12:31:43 ]
>>499
なるほど!ありがとうございます!



501 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 15:33:19 ]
>>500
do { a <- return 1
  ; Just 2
  }
って書くとemacsで見た目きれいにレイアウトできる。
>>=を使った場合、
return 1 >>= \a ->
Just 2
って書くときれいにレイアウトできる。
単に見た目の話だけど^^;;

502 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 00:28:19 ]
Haskell でも型のキャスト出来るんかね
リファレンス見てたらそれっぽいのが・・・。


503 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 00:31:47 ]
>>502
(1::Int32)

504 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 11:53:24 ]
>>503
キャスト自体は無いから、いちいち関数を使う
数値型の変換ならfromIntegralとかfloorとか
ポインタの変換ならcastPtr
ダウンキャストみたいに、実行時のデータから型情報を復元するのはData.Typeable.cast
>>503の構文は、型推論の補助として型を指定してるだけで、変換してるわけじゃない

505 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 16:20:26 ]
ダウンキャストに相当するのがあるのか。

506 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 20:12:04 ]
unsafeCoerceはどうよ?

507 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 20:26:50 ]
>>506
忘れてた
変換前と変換後の型の内部表現が同じであることを前提として、問答無用で型を変換するのが
unsafeCoerce :: a -> b
Data.Typeableのキャストはこれをラップして安全にしたもの

508 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 14:13:19 ]
ふつうのHaskell読み終えて、WikiBookとか眺めてるんですけど、ある程度まとまった
Haskellプログラムの実例が載ってる本というと、Craftになりますか?

ちょっと高価な本なので、買おうか迷ってます。

509 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 15:35:27 ]
>>94-96
research.microsoft.com/~simonpj/papers/history-of-haskell/index.htm
4.4 Declaration style vs expression style

510 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:30:20 ]
Kleisliってなんて読むの?



511 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:31:04 ]
クライスリーじゃないの?

512 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:33:20 ]
>>510
クレイスリ

513 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:04:55 ]
クレイスリ に一致するページは見つかりませんでした。

514 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:32:57 ]
クライスリーだって該当する記述が2chしかないじゃないかよ。

515 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:35:58 ]
とりあえずドイツ語っぽい綴りを
ドイツ語の規則に従って読んでる点で
クライスリーの方が信憑性はある

516 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:39:36 ]
TeXをテックと読むのはおかしいですか
Linuxをライナックスと読むのはおかしいですか

517 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:43:06 ]
おかしい

518 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:44:15 ]
↑でもそういう風に読んでる人結構いるよ

519 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:45:10 ]
大団円を大円団と勘違いしている人は
それはそれで正しいと申すか

520 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:46:27 ]
俺、小さいころミートボールとゲートボールの違いが分からなかった



521 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:47:54 ]
>>516
これは米語読みだから、
金日正を「きんにっせい」と読むようなもの。
特に問題ない。

522 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:48:09 ]
英語っぽっくウィヌックスで

523 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:34:53 ]
クライスリーでおk?

524 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:43:55 ]
別に何でもOK

525 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:44:19 ]
数学板で聞いてみたら?

526 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 22:15:00 ]
エルアイエヌユーエックスって読んでた・・・

527 名前:デフォルトの名無しさん [2008/02/15(金) 22:28:35 ]
dev.ariel-networks.com/Members/mizyo/haskell306e30b930ec30c330b730b930c630e03068stm306b306430443066-305d306e3

頭の悪いHaskell厨増殖しすぎwwwwwwww

528 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 08:55:10 ]
>>527
Haskellコミュニティを大事にする積もりがあるなら、間違ってると思うところを指摘してやれよw

529 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 21:01:38 ]
ゆりしー(´;ω;`)かわいそうです みなとらじお 君が主で執事が俺で 02
www.nicovideo.jp/watch/sm2336941

伊藤静「じゃあ、次もwww」
後藤邑子「斬ったほうがいい?www」
伊藤「次は斬る?www」
後藤「どうするww」

伊藤「ペンネーム『心が綺麗な天使』から頂きましったww(フンッwww) 私はこの日本に住むのにはピュアすぎます。どのようにしたら天使のような私がこの今の日本に馴染めるのでしょうか?」

後藤「.........ウザい」

二人「キャッハハハハハwwwww」

伊藤「ちょほんとさあ、大丈夫?www」

後藤「おい天使、おいおい自称天使ww」

伊藤「自分が天使だと思ってること自体がちょっと間違ってんじゃないの?っていうねwww」

後藤「うん。ね。ちょっと軽く(精神病院に)通院してみたほうがいいんじゃないの?www もしくは、今の日本に馴染めるようにちょっと汚れちゃえよwwww」

伊藤「それかもう日本出て行ったらいいんじゃないの?www」

後藤「天使が住める国にwwwwwww なんかエルフの国とかに行ったらいいんじゃないの?wwww」

伊藤「妄想の中とかに(プフッww)行っちゃえばいいんじゃないのwww」

後藤「コワイヨーwwwコワイヨーwwwww」

二人「クックックックwwww」

530 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 09:51:50 ]
Haskellのようなピュアな言語じゃ薄汚れた現実世界のアプリは書けないと言いたいのか?



531 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:06:05 ]
>>530
ffiが実装された時点でピュアじゃねーよ。
これからはHaskellを純粋関数型言語なんて呼ぶのはやめようぜ。

532 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:16:09 ]
別にffiも変なことしなけりゃ純粋さを壊さないだろ

533 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:28:40 ]
>>532
おっと、そんなこと言っちゃうのか?
純粋でない例が一つでもあれば、それは純粋じゃないんだよ。

534 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:39:56 ]
まあそうだ
でも一々「ほぼ純粋な関数型言語」とか言うのか?

535 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:48:31 ]
いや、ただの関数型言語だよ。
純粋なんて言葉をつけるのはおこがましい。

536 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:52:23 ]
いや、でも滅多に副作用を使わないのは事実だし、重要な特徴じゃん

537 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:57:12 ]
「モナディックI/Oを採用した関数型言語」でいいんじゃね

538 名前:デフォルトの名無しさん [2008/02/19(火) 08:11:48 ]
HaskellによるHaskellのための開発環境Leksah 0.1
ttp://builder.japan.zdnet.com/news/story/0,3800079086,20367512,00.htm

539 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 11:08:19 ]
副作用無しでなんでもできれば純粋ってことでいいんじゃね。
SchemeやMLは副作用無しじゃI/Oができないし。

540 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:44:17 ]
また公式落ちてるぞ
よく落ちる糞公式だな



541 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:11:23 ]
LuaってHaskell系だったのか
pc11.2ch.net/test/read.cgi/dtm/1194648279/216

542 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:29:53 ]
そのスレで既に十分突っ込まれてるじゃないか

543 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:42:17 ]
haskellのプログラムは巨大化する傾向があるようですが、
Cで作ったファイル並みに小さくするコンパイルオプションとかってないですかね?

544 名前:543 mailto:sage [2008/02/21(木) 22:43:03 ]
すみません、言葉足らずでした。
haskellで作った実行ファイルが巨大化する傾向がある、といいたかったのです。

545 名前:543 mailto:sage [2008/02/22(金) 20:08:04 ]
とりあえず1/10ぐらいのサイズにしたいのです。

546 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 21:22:26 ]
Cだって大きなプログラム作れば大きいだろ。

547 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 21:29:57 ]
とりあえず
・GHCの最新版を使う
・最適化オプションを有効にする
・strip
くらいじゃないか?
あとUPXとかで圧縮するのが有効というのを読んだ

548 名前:543 mailto:sage [2008/02/22(金) 22:16:46 ]
>>546
論外

549 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 00:47:37 ]
昔のGHCならCのソース出力するオプションがあったらしいんだが,今はないのか?
そもそもなんで実効ファイルが巨大化するのか調べた上での質問なら答えは直ぐに見つかるんだけどな

550 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 00:49:21 ]
現状ghcではruntimeだけで200KBくらいになってしまうので無理かと。
jhcとかyhcならば判らないですけども。




551 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 08:40:01 ]
libcや基本DLLよりずっと小さいよ。

Windowsの場合は、サードパーティが使える標準配布方式がないから、
静的リンクするか、インストーラー配布形式が必要になって、
それでこういう質問が増えるんだろうね。

お決まりの開発環境を使わないと、配布しづらい。

552 名前:デフォルトの名無しさん [2008/02/23(土) 13:39:30 ]
ghc だって libc に依存してるんでしょ

553 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 17:07:48 ]
C++だってhello worldでもバカ正直にスタティックリンクすれば何百KBとかなったりするじゃん
ダイナミックリンクでごまかしてたりするけど
機能持たせた言語の実行ファイルサイズが膨らむのはトレードオフ

554 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 07:49:13 ]
Craft買って読んでますが、練習問題の解答ってどっかにありますでしょうか。

555 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 12:24:26 ]
以前、IOモナド関連部分の回答を適当なワードでググった時はヒットしたよ
10分くらい探したけど

556 名前:554 mailto:sage [2008/02/24(日) 19:38:46 ]
つまり、ちゃんとした解答集のようなものは無いっちゅう
ことですかorz

そんな難しいものも少なそうなのでいいのかな

557 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 19:51:21 ]
>>556
現状では、ある程度関数型言語でのプログラミングの経験をつんだ人が
Haskellを触るという感じなので、
言語仕様を見たらわりとすぐに使えるという人向きの文書しか出回っていない。
そういう意味では初心者はとっつきにくいかもしれないね。

558 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 20:19:53 ]
また公式が落ちてやがる!!!!!!!!
なめやがって!!
マジ切れそうだ

559 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 20:47:32 ]
すみません、こちらのファイアウォールのせいで公式につながらなかっただけでした・・・
お騒がせしました

560 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 22:59:49 ]
>>558-559
wwwwwwwww




561 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 01:50:16 ]
wwwwwwwwwww

562 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 01:58:36 ]
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

563 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 02:08:33 ]
www.blue.sky.or.jp/grass/

564 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:06:50 ]
大卒で正社員じゃない奴ってこのスレに多そうだなw
知ってるか?高卒の生涯賃金って高卒の半分なんだぜwww_?
中卒なんてもってのほか
可哀想にお前ら
そんな俺はもう内定貰ってこのスレいますけどねw

565 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:18:49 ]
あいぉ(^ω^
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? 
> 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? 


566 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:20:52 ]
>高卒の生涯賃金って高卒の半分なんだぜwww_?

再帰的ですねwwwwww

chingin x = chingin x / 2
こんな所でしょうか。

ちなみにスタックオーバーフローしましたが何か。

567 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:22:51 ]
ちなみにこれね
society6.2ch.net/test/read.cgi/gline/1190374317/

568 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:26:57 ]
どうやら釣られてしまったようだ。。。

569 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:43:02 ]
>>566
せっかくHaskellなんだから
chingin = chingin / 2
でいいよ
解は0とNaNと±Infと⊥だな

570 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:39:37 ]
Nan = NanはFalseなんじゃないの?



571 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 10:33:53 ]
何を言っているのかね

572 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 15:30:47 ]
やってみた。
> 0/0
NaN
> 0/0 == 0/0
False
> 1/0
Infinity
> 1/0 == 1/0
True
> 1/0 == 1/0/2
True


573 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 15:32:37 ]
⊥なんて解で出てくるの?

574 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 17:18:37 ]
>>573
undefined

undefined / 2
は、どっちも同じ結果になる

575 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:35:34 ]
関数型言語関連で購読おすすめのブログをいくつか教えてください

576 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:44:34 ]
>>575
このスレ的にはここ
ttp://planet.haskell.org/

577 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 21:06:53 ]
haskellerの皆さんって、元々はSchemeとか使っていたんでしょうか?

自分、関数型はハジメテでちょっと戸惑いがあったんですが、SICPを読んでみたら
何か分かってきました。

Haskellは今のところそういう文脈というか、経緯を知っている人たち向けってこと
なんでしょうかね。

578 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 21:12:23 ]
俺はC++から入った
他の関数型は、SML入門をちょっとwebで読みあさった経験しかなかった

579 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 23:45:49 ]
Common Lisp -> OCaml -> Haskell

580 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 23:54:20 ]
WebProg -> Haskell



581 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 00:03:12 ]
C++ -> Haskell (あまりのパラダイムの違いに混乱中)

582 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:50:01 ]
>>581
C++のconcept(次の標準で入る)とHaskellのtype classは同じ。

自分は
雑多なLisp→Common Lisp→Miranda, CLOS, ML, C++→Haskell, Scheme, C++

583 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 02:00:01 ]
>>577
そうですね。
関数型言語での再利用とオブジェクト指向言語での再利用では
毛色が全く違うので戸惑うでしょうね。

584 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 02:03:51 ]
関数型言語といっても、遅延評価が入るだけでかなり質が変わってきますよ。
LispやMLの方がCプログラマには分かりやすいでしょう。

585 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 02:20:11 ]
>>577
Haskellはそういう知識を得ることが楽しい人向けの言語。
先に知っていても、必要だと思ってそこで勉強しても、どっちでもいいと思う。
まあとにかく世界の広がる言語だと思う、Haskellは。
Schemeも面白い。

586 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 02:25:30 ]
モナドを学ぶのにオススメの書籍やwebサイトはありますか
一応一通り検索して解説を読んでみたんですがいまいち概念を把握できてないです

使う分には困らないんですが

587 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 11:56:49 ]
>>586
圏論の基礎

588 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 12:12:57 ]
>>586
>>421


589 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 15:05:15 ]
母:順へ げんきですか。いまめーるしてます

順:うるさい死ね メールすんな殺すぞ

母:ごめんね。おかあさんはじめてめーるしたから、ごめんね

順:うるさいくたばれ、メールすんな

母:ちゃんとご飯食べてる? お金送りましょうか?

順:うんありがとう。かあさんこそ体とか大丈夫?

590 名前:577 mailto:sage [2008/03/01(土) 19:22:00 ]
なるほど、やはりLispからの方が多いんでしょうかね。

自分はLisp系知らずにHaskellやろうとして、map、fold、zipWithなどのリスト操作が
最も基本的なものとして扱われているのがピンときませんでした。

色々文書読んだりした後で、SICPを読んでみたら凄い分かってきましたよw。どうも
そういう文脈にある人々向けにドキュメントなどが作成されているなぁと。JavaやC#
とかが、C、C++の文脈を知っている人向けのドキュメントが多いのと同じでしょうかね。



591 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:21:53 ]
map, reduceは他の言語でも、
コレクション周辺でサポートされてるよね?
ただgeneric function系じゃないと、
ちょっと趣きが違うから戸惑うのかも知れないが。

592 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 04:50:00 ]
>>590
まず、今までループで処理してたところを全部再帰で考え直してみようよ。
再帰処理の部分を一般化して関数にできないかどうか考えてみようよ。

593 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 04:50:39 ]
SICPってMITの1年生用の教科書でしょ?

594 名前:577 mailto:sage [2008/03/02(日) 08:02:16 ]
>>591
ありますけど、理科系研究の実習用プログラムとかではない限り、あまり
使われないんじゃないかと思います。実際、言語の入門書類でも大きくは
扱われませんよね。

>>592
再起はそんなに戸惑いはありませんでした。どちらかと言えばループが
手続きの部分として扱われるのに対して、関数型ではそういう書き方は
あまりしない(醜いコードとなる)ってことですね。

>>593
そうです。すごい良書だと思います。

595 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 10:43:26 ]
>>594
> 実際、言語の入門書類でも大きくは扱われませんよね。

入門書は年々数が増えていっていると共に、
糞本の割合が増えていっているから、
入門書一般の常識はいまや非常識といっていい状態。
本格的に取り組む入門書は嫌われるから。

関数型言語、特に本場の本は良書が多くてそういう心配はないんだけど。

596 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 10:51:29 ]
古くても良書とされている入門書を店頭にわかりやすく並べている
本屋の数は、日本に人間の指の数ぐらいしか無いんではなかろうか。
他は次々と出る駄本の新刊を並べてるだけ。

597 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 10:53:22 ]
Rubyなんかだとmapやinjectを使うのが当たり前かと思ったけど、そうでもないのか

598 名前:577 mailto:sage [2008/03/02(日) 11:26:03 ]
>>595
自分はSICP読んで、何でもっと早くに手に取らなかったのか、と後悔してます。

>>597
Rubyのそういった機能は関数型由来のものですよね。C言語系列の手続き型
にはあまり登場しないんじゃないかと思います。

599 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 12:03:41 ]
使えないand/or使いたがらないand/or嫌悪する奴もまたいますな

600 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 23:34:31 ]
and と or って左結合?



601 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 13:53:14 ]
THE HITCHHIKER'S GUIDE TO THE HASKELL 「HASKELL の歩き方」
ttp://ha6.seikyou.ne.jp/home/yamanose/haskell/home.html

web上の日本語の入門文書で、言語全体をカバーしてるのは初めてじゃないだろうか

602 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:12:31 ]
>>601
なぜに自転車屋のホームページ?w
ラジオ部 って何?w

モナドに関して、あえて説明しないってのは、入門としてはありかもね。

603 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:38:42 ]
Parsecを理解できる書籍って

普通のHaskellが妥当かな?

604 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 08:55:56 ]
ひらがなで書かないと書籍名に見えないw

605 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 09:07:55 ]
>>603
www.cs.nott.ac.uk/Department/Staff/gmh/monparsing.ps

606 名前:602 mailto:sage [2008/03/07(金) 13:57:47 ]
よく見ると>>601って、
手続き言語的にHaskellを解説してるように思えるな…。

こういう入門書でHaskellを学ぶ人が多くなると、
オブジェクト指向の時みたいに混乱しそう…。

初心者のオレでも?なコードがある…。


607 名前:606 mailto:sage [2008/03/07(金) 15:35:46 ]
あぁ!「?なコード」は
>>601 でなくて、>>601 で参照してる↓だった
関数型プログラミング言語 Haskell 早巡り
ha6.seikyou.ne.jp/home/yamanose/haskell/INTROHUG.HTML



608 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 17:08:28 ]
最近のライブラリはほとんどarrowベースになってるんだなぁ・・・

609 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:39:33 ]
>>608
自分、Craft読み終えたばかりでモナドも入り口しか知らない…

道は遠いなぁ

610 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 18:58:13 ]
ghcに-prof -auto-allを付けると最適化が弱まるのはいやがらせか?
フルに最適化の掛かったコードのプロファイルを取るにはどうすればいいんだ



611 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 19:14:50 ]
>>610
最適化ありとなしなら違うだろうけどそれぐらいなら大差つきそうな感じもしないし
だいたいでいいんじゃない?

612 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 19:55:01 ]
>>611
いや、一番内側のループにGHC.IOBase.>>の呼び出しやらunboxing/reboxingやらが残るんだ
もともと最適化で余計なものが全部消えることに期待しているソースなので、影響が大きい
実際、プロファイル版だと通常版の7倍くらい時間が掛かる
もちろんプロファイルのオーバーヘッドもあるだろうけど、別のソースだと3倍くらいで済むので、
最適化がうまく効かないことの要因が大きいと思う

613 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 13:44:15 ]
wxHaskell 0.10.3 rc1が出てた。

614 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 16:47:24 ]
wxHaskellをスタティックリンクする方法ありませんか?

615 名前:デフォルトの名無しさん [2008/03/18(火) 09:56:50 ]
Gtk2Hsと比べてどうなの?

616 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 21:37:58 ]
ghc test.hs -o test
とやった時に生成される
test.hi
test.o
test.manifest
この3つのファイルを生成させなくする方法ってないですか?

617 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 21:52:22 ]
>>616
manifestファイルの生成は-fno-gen-manifestで抑止できる
ただし多少の副作用がある。詳しくはマニュアル参照
oとhiの生成を止めるのは多分無理。これなしじゃ分割コンパイルできないし
ファイルが残るのが嫌なら、ghcを実行した後にoとhiを削除するスクリプトでも組めばいい

618 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 22:10:49 ]
>>617
ありがとうございます
スクリプト書いて我慢することにします。

619 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 20:13:49 ]
Introduction to Functional Programming Using Haskell
¥ 11,554 (税込)

ペーパーバックでこれって…。何でこんな高いの?

620 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 21:11:09 ]
Bird大先生の書いた素晴らしい本なのでその価値はあります。
文章はもちろんコードが素晴らしいです。



621 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 21:19:32 ]
>>619
需要と供給の関係じゃない?

622 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 21:33:24 ]
>>621
Craftとかと比べるとあんまり売れ筋じゃないってこと?

623 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 21:47:52 ]
>>619-620
「関数プログラミング(using Miranda)」はもっと安いYO!i

624 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 22:32:20 ]
正直コードのぱっと見はSASL系のMirandaの方が好きだった。比Haskell

625 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 22:54:32 ]
>>619
円高なんだから.comの書店から輸入すれば安いYO!

626 名前:デフォルトの名無しさん [2008/03/20(木) 13:46:58 ]
>>624
どの辺が違うの?

627 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 13:48:34 ]
>>624
Mirandaスレ逝けYO!

628 名前:619 mailto:sage [2008/03/20(木) 13:57:36 ]
っていうか、もう買っちゃったんだけどw

ついさっき届いたんだが・・・チョっw、Craftとかよりも紙が安っぽいwww

これ、11,554円か・・・。頑張って自分のモノにしないとなw

629 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 14:32:26 ]
1966年にP.J.LandinがISWIMという言語を作ったのがその起源で、SASL, Mirandaという後継言語を経て、HaskellとCleanが生まれました。
これらは、全て「遅延評価」を評価戦略におくプログラミング言語であり、「純粋関数型言語」と呼ばれるグループです。

SASL系のMiranda???イミフ。

630 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 19:31:56 ]
1954年にJ.BackusがFORTRANという言語を作ったのがその起源で, Algol, Cという後継言語を経て、C++とJavaが生まれました。
これらは、全て「副作用による状態の更新」を実行の基礎とするプログラミング言語であり、「手続き型言語」と呼ばれるグループです。

Algol系のC???イミフ。



631 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 19:39:51 ]
wxHaskell 0.10.3 が出たみたい。
sourceforge.net/project/showfiles.php?group_id=73133

632 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 23:22:00 ]
遅延評価よりもしっくりくる言葉はないものだろうか
直訳で不精評価とか?

633 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 23:37:01 ]
>>632


634 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 23:45:23 ]
SASL系のMirandaって何?Haskellは何系なの?クワシク。

635 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 00:00:20 ]
HaskellはMiranda系です

636 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 00:20:12 ]
>>630 なにが意味不なのかわかんね

637 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 00:53:22 ]
英語が難しくてよく理解できないのでつがw

638 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 10:58:06 ]
>>629 なにが意味不なのかわかんね

639 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 11:43:24 ]
Point-free styleで
\a b -> a*b + a/b
を書くにはどうすればいいですか?
一般に,同一の引数を複数回使うような関数はどう定義すればいいですか?
さらに例えば2引数a, bを取って,それらを複数回使い,
その場所が構文木の深さで並べたとき交互に入り混じるような関数はどう定義すればいいですか?
\a b -> a + exp(b + exp a)
みたいな.
* idとかを使って形式的に同じ深さにする(例えば snd(id b, id a) + exp(id b + exp a) とする)
* 2変数関数に同じ引数を与えるようなapplyをあらかじめ定義しておく
(そう言えばSコンビネータは S f g x => f x (g x) でxが2回出てくるなぁ...)
が鍵かなーと思ってますが,一般にはどうすればいいのか.

640 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 13:18:34 ]
Control.MonadとControl.Monad.Instancesをインポートするとこの二つが使える
ap :: (a -> b -> c) -> (a -> b) -> a -> c
liftM2 (.) :: (a -> b -> c) -> (a -> d -> b) -> a -> d -> c
どっちも便利



641 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 13:51:22 ]
s = \ x y z -> x z (y z)
k = \ x y -> x
i = \ x -> x
-- f = \ a b -> a * b + a / b
f = ((s ((s (k s)) ((s ((s (k s)) ((s (k k)) (k (+))))) ((s ((s (k s)) ((s ((s (k s)) ((s (k k)) (k (*))))) ((s (k k)) i)))) (k i))))) ((s ((s (k s)) ((s ((s (k s)) ((s (k k)) (k (/))))) ((s (k k)) i)))) (k i)))

642 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 14:37:06 ]
返り値がユニットって他の言語で言うvoidの事ですか?

643 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 14:43:08 ]
他の言語ってどの言語だよw

644 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 14:46:42 ]
例えばcやJavaです

645 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 14:59:03 ]
>>634
> SASL系のMirandaって何?

Turner大先生の作った言語がSASL→KRC→Miranda
en.wikipedia.org/wiki/Miranda_%28programming_language%29

Mirandaは売り物じゃなければもっと普及したと思う。

646 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 19:45:21 ]
>>642
全く違います。
Unitは値ですがvoidは値ではありません。

647 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 21:22:47 ]
全く違いますか・・・
勉強しなおしますい

648 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 21:26:41 ]
void 式は存在するし、C++ だと return 文にも渡せるが、
void 式を入れる変数が存在しない点が Unit とは大きく違う点か。

649 名前:デフォルトの名無しさん [2008/03/23(日) 21:46:56 ]
TAPLにはunitとCやJavaのvoidの使われ方は近いと書いてあるね。

650 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 21:57:00 ]
使われ方は近いっていうのと概念が近いってのを混同せぬよう。



651 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 22:36:57 ]
voidは引数として渡せないしな。

652 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 22:51:43 ]
データ構造にも入れられない

653 名前:639 mailto:sage [2008/03/24(月) 00:09:11 ]
>>640
Control.Monad.Instances って関係あるんですか?
つーか Control.Monad の ap や liftMn は (Monad m) => ... m a -> ... な感じでモナド専用なのでは?

>>641
トランスレータ乙w
Wikipediaに載ってる変換アルゴリズムには
> In general, the T[ ] construction may expand a lambda term of length n to a combinatorial term of length Θ(3n).
とありますが.
まぁSKIがあれば不可能な訳ではない,と...

R. Bird先生とかの論文で習うしかないのかなー

654 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 00:11:01 ]
日本語でおk

655 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 00:19:18 ]
instance Monad ((->) r) -- Defined in Control.Monad.Instances

656 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 01:13:02 ]
lambdabotのplというプラグインが自動でポイントフリー変換をしてくれる
\a b -> a*b + a/b
を入れたら
ap (ap . ((+) .) . (*)) (/)
が返ってきた

\a b -> a + f (b + g a)
だと、
ap ((.) . (+)) ((f .) . (+) . g)

657 名前:初心者修業中 mailto:sage [2008/03/24(月) 04:17:08 ]
あの、結局、ポイントフリーは

「クイズとしては面白いけど無理に使う必要はない」

という事ですよね?

658 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 07:52:47 ]
当然だ
使うに値すると思ったときだけ使えばいい

659 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 04:01:38 ]
Birdの一派は「ポイントフリーの方がプログラムの本質が一層明らかになる」とか主張するんだよね

660 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 04:21:26 ]
彼らの変形萌えぶりをみれば、
それほど無茶を言ってないと思えるよ。
プログラム変換(人力)で成果挙げてるからね。



661 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 00:32:30 ]
Haskell のテストコード書いたり、簡単な実行したりコードさらしたりするにはここへカモン。
codepad.org/
コードを書いて実行した時のURLを記録しておけば、
実行結果も一緒にさらす事が出来て幸せです。



662 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 04:41:11 ]
なんであんたあちこちで宣伝してんの?

663 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 12:06:11 ]
GHCのドキュメントをMakeするときに必要な
stringparamっていうプログラムって何でしょうか?これが無いせいでhtmlドキュメントが生成できません
xmlproc関係のものだと言う気はするんですが、検索しても見付かりません
入手方法など情報お願いします

664 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 12:20:15 ]
stringparamはプログラムじゃなくてxsltprocのコマンドラインオプションじゃないか?

665 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 21:14:03 ]
なるほど、どもです
どうやら原因はMakeの中で上手くxsltproc関連の変数が設定されてないのが原因でした

666 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 01:33:37 ]
以下のコードでtimeout関数の動作確認をしたのですが、
うまく動作しません。何がいけないのでしょうか?

import System.Timeout

main = do a <- timeout (3*10^6) getLine
print a



667 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 02:07:19 ]
>>666
俺の環境(Linux x86 ghc-6.8.2 base-3.0.1.0)だと動いたよ
windowsだとHandleからの入力でブロックするときにselectを使ってないから、そのせいかも

668 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 19:56:39 ]
モナドとかって解りやすく
書いた論文とかありますか?

PARSEC使いたいのですが
どうにも曖昧で


669 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 20:15:35 ]
>>668
I Love Ruby本

670 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 20:50:09 ]
>>668
つ "The marriage of effects and monads"
つ "Tackling the awkward squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell"

ググればPDF手に入る



671 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 20:56:19 ]
parsec使うのにモナドの知識は必要ないけどな

>>670
Tackling...はIOモナドについての論文じゃないか?

672 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:02:17 ]
だったら何?

673 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:06:05 ]
モナドについて知りたがってる奴にIOモナドの事を教えてもしょうがないだろ
群について知りたがってる奴に整数を教えるようなものだ

674 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:08:14 ]
>>673
あとkindとかって数学の眠い本永遠と
読まないと理解できないかな?

圏とかまじで数学本気でやってねーから解らん

675 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:18:11 ]
kindは全然難しいものじゃない
「Maybe Int」型の式は存在するけど単なる「Maybe」型の式は存在しないとか、
「Maybe Maybe」っていう型は不正だとか、そういう次元の話

676 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:21:18 ]
パージングするとIOモナとの連携は付き物だから、
>>668は知りたくなるんじゃないかな?
知らなくてもPARSEC使えるけどね。

677 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:28:50 ]
知らなくても使えるんだけど
背景とか基礎的な内容知りたく
ならない?

ならない、そうですかそうですか.....

678 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 21:41:01 ]
Trends in functional
Programmingって毎年出てるの?

679 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 01:49:14 ]
>>668
"Monadic parser combinators"ってテクニカルレポートが
仕組みやモナドの解説が分かりやすく書いてあってよかった。

680 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 09:06:14 ]
自分は手続き型のメジャー言語を普段使っている人間ですが、最近関数型が話題になって
勉強しているところです。

この板の書き込みもそうですし、実際に出版されている本の数や内容など見ると、まだ
Haskellのような言語は研究者レベルの言語なんでしょうか。

個人的には今後アプリがマルチプロセスに対応せざるを得ないとか、複雑性が上がる
中で処理の信頼度を一層高める必要がある中で、Haskellのような言語がある時期から
一気にパラダイムシフトを引き起こすのじゃないか、とか妄想していますが、単なる
妄想ですかねw



681 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 09:25:48 ]
Haskellは、ある時期と言わず今、実用プログラムを(分野にも依るけど)書く上で有力な言語だと思うよ
その意味で、Haskellは既に研究レベルの言語ではない
一方で、今のHaskell利用者に占める研究者や学生の割合はそれなりに高いだろうし、
Haskellが研究の道具として使われてるのも事実だから、その意味で研究者の言語だ

682 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 09:59:31 ]
>>680
遅延評価のHaskellから、
> ある時期から一気にパラダイムシフトを引き起こすのじゃないか
ってのはちょっと難しいだろうね。

> 研究者レベルの言語

こういう考え方はよくわからない。
自分の腕を上げるために必要なことは学べばいいだけなんで。

683 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 10:01:57 ]
immutableにするとスレッドセーフになるのは分かる
代入ができなくても別に困らない、というのも分かる

分からないのは遅延評価
原則的にはeagerにして必要なときだけ明示的に遅延するのでは駄目な例ってないすか

684 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 10:10:05 ]
>>682
> 遅延評価のHaskellから、
> > ある時期から一気にパラダイムシフトを引き起こすのじゃないか
> ってのはちょっと難しいだろうね。

これはどういう意味でしょうか?

685 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 10:12:07 ]
>>683
駄目ってことはないんじゃないか?
Haskellは、原則的には遅延で必要なときだけ明示的にeagerという立場だから、
Haskellコードを、デフォルトがeagerな言語に翻訳するのは機械的な書き換えで済む
どっちをデフォルトにするのが便利かは議論の分かれるところじゃないだろうか

686 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 10:16:32 ]
>>683
「つまらない」そこが駄目

687 名前:680 mailto:sage [2008/04/06(日) 10:24:01 ]
>>683
SICPなんかだと、参照透過性と遅延評価をStreamの項で関連付けて
いたりしますが、その辺へのこだわりではないんでしょうか?

688 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 10:33:23 ]
1988年?ぐらいの関数言語を実装するための
本があるはずだけど
あれみれば遅延評価背景わかるはず

本の名前が解らん


689 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 11:17:06 ]
>>688
research.microsoft.com/~simonpj/papers/slpj-book-1987/index.htm
これ?
lazy evaluationの正当化は194ページにちょっとあるだけかな

690 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 11:23:03 ]
>>689
おーそれそれ
あとどれだったかなぁ




691 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 19:27:55 ]
日本だとどっちを先に読めって言われてるの?
・Introduction to Functional Programming Using Haskell
 www.amazon.co.jp/exec/obidos/ASIN/0134843460/
・Haskell: The Craft of Functional Programming
 www.amazon.co.jp/exec/obidos/ASIN/0201342758/



692 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 20:25:11 ]
>>691
自分はCraftを先に読みました。Craftは所謂Haskell言語の入門書だと思います。

Introduction〜はHaskellの入門というよりも、関数型言語の原理原則を中心に
展開する書物ですね。自分は今読んでる途中です。

どちらもよい本だと思います。

693 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 20:25:18 ]
>>691
欧米だとどっちを先に読めって言われてるの?

694 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 20:28:17 ]
片方が初級で片方が中級、とかではないですね。

695 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 20:46:40 ]
>>693
俺の恩師のイギリス人のじいちゃん先生
だと、今の若い人間には退屈すると
長続きがしないだろう。好奇心だけでは
どうしても無理だろう。といって、Craftを
読んで言語を理解しなさいと言われたなぁ



696 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:14:53 ]
このすれの住人って
俺以外に、5人しかいないだろ?

697 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 03:08:19 ]
日本でHaskellやってる人間なんて100人未満だろうな

698 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 03:13:05 ]
だってモナドって何ですかって聞くと
「圏論について勉強するといいよ」って返されるんだもん

そしてwikipediaで圏論の説明見てわからず涙目になる俺

699 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 04:11:20 ]
>>697
3000人じゃなかった?

700 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 06:33:59 ]
Haskellでモナドを使ったり作ったりする分には圏論の知識なんて要らないけどな



701 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 10:04:01 ]
>>699
そのうち何人が実際にソフトウェアを記述するかといったら100人未満だと思うよ

702 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 00:19:34 ]
Webの自動テスト
Haskellで書くと面白いんだけど
Arrowが良くわからん

あれが必要ななんでどうまくつかいこなせない

703 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 06:49:34 ]


704 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 08:26:47 ]
和訳すると、
「よくわからないArrowが必要なせいで、うまく使いこなせない。」

705 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 18:22:44 ]
arrowより日本語を使いこなした方がよいのでは…

706 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 18:38:51 ]
まぁ、arrowよりも日本語の方が長く使うだろうからなぁ。

707 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 18:42:17 ]
分からないぞ、突如GHCが日本を占拠して日本語の代わりにHaskellを使うように命じられるかもしれない。

708 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 18:48:55 ]
それは中国が世界を支配する確率とどちらが高いかね?

709 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 20:42:39 ]
GHC とは General Headquarters Compiler の略だったのか・・・
ギブ・ミー・モナド

710 名前:デフォルトの名無しさん [2008/04/10(木) 11:30:08 ]
>>702
Arrowが必要なのは、Arrowベースのテストツールかなにかを
使ってるからなんだろうけど、なに使ってるの?



711 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 21:50:55 ]
>>710
作ってるのw

712 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 11:39:16 ]
しかし雑談ばっかりだなこのスレ

713 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 11:56:43 ]
うまく使いこなせないのに必要だと分かって作ってるんですか

714 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 23:23:30 ]
モナドってHaskellに限った考え方ではなくて、もっと一般的な考え方なんだよね?

ほかの言語にモナドの考え方を応用したようなライブラリが、もっとあってもいいと
思うんだけどな。副作用嫌いな人は喜ぶと思うんだけど。そうでもないのかね。

715 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 23:36:10 ]
すでに他の言語でもあることない?
すんごいマイナーだけど

716 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 01:17:35 ]
Python でモナドを実装してみたよ、ってのはネットで見た気がする。

717 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 01:19:07 ]
これだ。
www.valuedlessons.com/2008/01/monads-in-python-with-nice-syntax.html


718 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 02:47:54 ]
okmij.org/ftp/Scheme/monad-in-Scheme.html
okmij.org/ftp/Computation/monadic-shell.html


719 名前:デフォルトの名無しさん [2008/04/12(土) 21:48:14 ]
引く手あまたのプログラミング言語は?
slashdot.jp/developers/article.pl?sid=08/04/06/2313251
---
Java(16479件)、C++(8080件)、C#(7780件)、JavaScript(6749件)、
Perl(5710件)、PHP(2641件)、Python(1408件)、COBOL(1207件)、
Ruby(769件)、Lisp(33件)といった感じらしい。

とりあえずJavaとC/C++/C#、あとJavaScriptを覚えれば、
当分仕事には困らないようである。COBOLのしぶとさも目立つ。

ちなみにHaskellやOCamlの求人は10以下だったそうだ。
---

720 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 23:28:51 ]
JavaはともかくC#はどうかな…?
10年後には残ってない気もするが。



721 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 00:54:40 ]
そんなことよりもHaskellの求人が存在するのか!!
どんな仕事だ?

722 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 02:47:10 ]
リンク先まともに読んでないが
単に列記されてるのカウントしてるだけじゃねーの?

723 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 03:03:37 ]
HaskellとかOcamlの仕事とかどんなんか見てみたい
研究用じゃないよな

724 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 03:05:42 ]
Haskellでグラディウスを作る仕事です。
誰でも簡単にできる楽しい作業です。
初心者歓迎。

725 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 08:25:34 ]
0 <= 10 → True

726 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 08:30:48 ]
0は10以下でないとか、全部は一部でないとか、空列は列でないとか、自然言語には奇怪な慣習があるのです

727 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 09:21:12 ]
Hugs> -10 <= 10
True

728 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:27:42 ]
Haskellerお断り 10件w

729 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 11:00:54 ]
アメリカの大学では、(企業もだけど)
フルタイムやパートタイムの非常勤プログラマーを雇うことがあるから、
Haskellはその類いかも知れない。



730 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 11:10:29 ]
>>723
www.janestcapital.com



731 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 13:02:12 ]
だけど、関数型言語の勉強は仕事で使わなくてもやったほうが
いいと思うけどな。手続き型で出やすい不具合をどう防ぐか、
無駄の無い記述をどう実現するか、とか勉強になること多いと思うよ。

732 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 13:08:30 ]
個人的には手続き型ベースのOOPLのコーディングに影響があったかというと微妙な気が。
具体的にどういうこと?

733 名前:デフォルトの名無しさん [2008/04/13(日) 13:11:08 ]
一々メソッドや変数の名前を考えるのが面倒で
コーディングする気力が萎えて来るとか…

734 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 13:18:35 ]
海軍でhaskell使ってると思う
どこの国かは言えんが
topでGHCかりかり動いているみたことある

735 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 13:25:20 ]
lambdaの導入とかそういう文法レベルでの影響は0ではないか。

736 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 13:30:55 ]
C++は次でラムダ実装する
Intelのスレッドライブラリもラムダ標準実装
C#も次期バージョンのサポート予定
Javaはかすだけどサポートするらしい(いらねw



737 名前:デフォルトの名無しさん [2008/04/13(日) 13:56:04 ]
あるとか無いとか、仕様のマトリックスを埋めるだけなら意味無いよ
C++ 自体がイラネ

738 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 14:04:04 ]
>>732
いや、単純に(再)代入が許されない世界で、再起を使うとか、リストデータを
編集してそこから必要な情報抜くとか。そういうの訓練すると影響あるんじゃない
かなぁ。

手続き型だと「要するにこれはどういう処理か」って考えずにずらずらと手続きを
書き連ねていって、目的のデータを何とか作ってしまう、とかなりがちだけど、
その辺が意識変わると思うんだけどね。

739 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 14:12:31 ]
副作用を0にするって考えは
通常の手続き型に慣れると
そうぞうすらしない奴も多いから
F言語はシンプルな世界観を持つ
ためにはある程度知る必要があると
おもふ
別に変態的に知る必要はまったくないけど

それよりCraf本読むのに6時間かけてまだ
6章しか読めん俺はおわっとる

740 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 17:52:54 ]
>>736
VBで既に導入されてなかった? >λ式



741 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 17:53:27 ]
C#にも既に入ってる

742 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 20:29:34 ]
C#とかにλ式が導入されるとか、ちょっと意味不明というか、統一感が無さ過ぎる感じが
するがどうなんだろうか。だったらF#とかでいいじゃないか?って気がするけどな。

実はF#への移行の布石だったりして。

743 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 20:58:22 ]
元々あった無名delegateの構文を整理しただけだから、そんなに大袈裟な話でもない
どっちにしろ、まともな高水準言語なら無名関数の類はあって当然で、統一感とか気にしてる場合じゃない

次は代数的データ型とパターンマッチに相当するものが入るといいな

744 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:12:29 ]
>>743 >まともな高水準言語なら無名関数の類はあって当然で、
私が言葉尻に拘ってるのかも知れないが、なぜ?

745 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:22:47 ]
>>744
上であがってる古い関数言語の実装の
論文読んでみなよ何が要素として定義
されていて必要なのかわかるから

746 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:27:35 ]
>>745
でもC++とかには(少なくとも現在の規格では)無いわけだし、
実際無名関数みたいな仕組みは無くてもプログラムを組むことはできるし、
それらの事実を踏まえた上で>>744>>743が「あって当然で」と言っているその考えを聞きたいんだと思うんだが。

あった方がプログラミングが綺麗になる部分もあるのは当然の話だが。

747 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:29:40 ]
それこそ言葉尻じゃねw
モダンな言語は取り入れる傾向にあるとでも読み換えたら。

748 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:47:26 ]
>>746
OOが無くても手続きはできるし
アジャイルがなくてもそれ相当のことはいくらでもできる。
Cで、どんな手段でもOKならfor_each構文を作ることもできる

結局、ラテン語やその他の自然言語がどんどん変革していったように
プログラミング言語も変わっていくだけだと思うよ
ただそこには、今まで苦労した結果を簡単に置き換えることで
本当の問題にどれだけ注視して取り組めるようすることを
追求しているだけだと思うよ。リスクの低減と開発効率の上昇

自然言語に対する機械言語の仕様変更とイディオムの変更は
とてつもなく早いのでそれに対する拒否反応や疑問は常時出てしまうけど
それは仕方のないことだろうし。まぁ慣れてくれ

749 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 00:34:46 ]
>>746
> でもC++とかには(少なくとも現在の規格では)無いわけだし、

今もあるぞ、制限が多いだけで。
C++0xで言語自身に組み込みになってより強力になる。

750 名前:デフォルトの名無しさん [2008/04/14(月) 01:01:34 ]
C++ にクロージャ入れても意味が無い



751 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:45:24 ]
わざわざ関数オブジェクトクラスを定義しなくて良いという
くだらないが重要な利点があります

752 名前:デフォルトの名無しさん [2008/04/14(月) 08:38:21 ]
そして文法が果てしなく汚れて行く…

753 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 08:52:25 ]
Haskell には今話題にあがってるような、構文、言語機能の拡張ってないの?

754 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 17:18:28 ]
提案されてきた拡張は数えきれないくらいある
いくつかはGHCにも実装されてるし

755 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:34:05 ]
C#にクロージャとかって、どうも奇妙な感じがするのは、関数型言語って
自然数なんかもλ式で表現する、つまり「全ては関数なり」という一貫
した思想に基づいて設計されてるわけでしょ?

C#やJavaなどのオブジェクト思考言語って、値が全てなんだよね。
値を操作するために関数がある。そこにクロージャとかって、何か
意味があるのかね。

756 名前:デフォルトの名無しさん [2008/04/14(月) 20:41:20 ]
オブジェクト指向言語を知らないからそう思うんじゃないの。
オブジェクト指向言語で関数オブジェクトを扱えるのは別に
おかしな事じゃない。関数型言語でオブジェクト指向する事も
出来るし。

757 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:47:01 ]
>関数型言語って
>自然数なんかもλ式で表現する、つまり「全ては関数なり」という一貫
>した思想に基づいて設計されてるわけでしょ?
これがそもそも勘違い
例えばHaskellのIntは関数じゃない

C#やらJavaScriptやらにクロージャがあって役に立つのは事実
例を知りたければ適当に検索すればいくらでも見つかると思う

758 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:04:05 ]
副作用がある言語のクロージャってのも、
それはそれで使いでがある。
SICPをやってみればわかるけども。

759 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:24:38 ]
>>756
それってUtility的なものでしょ?

どうも変な感じするけどなぁ。

760 名前:デフォルトの名無しさん [2008/04/14(月) 21:36:49 ]
そりゃ、あんたがどう感じるかで言語設計している訳じゃないからな。
オブジェクト指向が値が全てと言うのは勘違いだし、クロージャも
みんな昔から便利に使っている。それだけ。



761 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:50:02 ]
なんだこのNOOBどもは
小学生の議論してんなよ

762 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:51:03 ]
あ、そうw

いや、俺が感じるというか、計算モデルがそもそも違うと思うんだけどね。

まぁ、いいかw

763 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:53:29 ]
なんかさ、大学でちょっとかじったぐらいのやつらの話ってうざくね?
いかにも知ったかぶった感じで話すやつら。

764 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:54:57 ]
ネトゲ厨降臨中

765 名前:デフォルトの名無しさん [2008/04/14(月) 21:55:00 ]
>>762
アクター理論とかはどうなの?

766 名前:デフォルトの名無しさん [2008/04/14(月) 21:57:48 ]
OO 特有の計算モデルとかあるの?

767 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:15:57 ]
昨日教科書読みました、みたいな発言やめてください。
背中がむずがゆくなります。

768 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:19:30 ]
偶然ですね。私も昨日SICP読みました。さっぱりわかりませんでしたがw

769 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:21:28 ]
学のない奴が語っちゃいけませんかそうですか

770 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:22:47 ]
学の無い人間は尋ねる側ので、語る側ではないな。



771 名前:デフォルトの名無しさん [2008/04/14(月) 22:23:40 ]
じゃあ頭の出来が違う人達に語ってもらおうぜ

772 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:28:21 ]
命令すんなよw

773 名前:デフォルトの名無しさん [2008/04/14(月) 22:30:06 ]
それなら気が向いたらでいいから宜しく頼むわ

774 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:30:13 ]
>>762は学のあるなし以前に、自分の意見をまじめに伝えようとしてないから、相手にしないほうがいい

775 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:37:10 ]
Haskellの拡張については 昨日教科書読みました 程度では語れるレベルじゃないから、
Haskellでの実装の話しろよ。

776 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 23:05:51 ]
BrainfuckでHaskell作ろうぜ

777 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 07:30:06 ]
Haskell初心者ですが、勉強した印象として構文が若干
多いかな?という感じがします。型に関係する部分とか
特に。

これってHaskellerの間で議論があったりするんでしょうか。
比べてはいけないんでしょうけど、Schemeのようなシンプルさ
で同じような型チェックができたら最高なんですが。

778 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 08:25:11 ]
それはCとC++比べてるようなもんです。どうしても嫌なら、
ML系のオブジェクト指向が入ってないのをやってみてはどうでしょうか。

779 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 10:31:09 ]
OCaml?

780 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:26:40 ]
>>779
たぶんCaml liteの方。でなきゃSML。



781 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 21:15:56 ]
>>777
ぐちぐちうぜーこと言ってるなら
使うな辞めろうぜーんだよ
お前のチラ裏報告なんて誰も
求めてねぇよ

さっさと消えろよ

782 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 21:39:09 ]
>>777
厳格な型付けをする言語では避けて通れないんじゃないの。むしろ、それを望む人には
必要不可欠かと。

783 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 22:47:46 ]
空気読まずに失礼しますが、
runhaskellの引数にプログラムを書いて実行する方法はありますか?
たとえばrubyだと
$ ruby -e "print 'abc'"
のように書くことが出来ますよね。
同じような使い方をHaskellでしたいんです。

784 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 05:22:47 ]
ghc -e 'putStrLn "abc"'
Hugsだと多分無理

785 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 20:56:38 ]
>>781
かわいいw

786 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:48:13 ]
Types and Programming Languages

Introduction to Functional Programming Using Haskell

カバーしてる内容全然違う?

787 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 00:32:17 ]
はい、上は型理論の入門書です。
数学分からない人は絶対に読むべきじゃないです。

788 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 00:36:37 ]
>>787
ここ数年の少年ジャンプの面白さを
発見するよりは簡単なはずだが?


789 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 00:44:07 ]
>>788
「型推論のHindley-Milner type inference」とかでピンと来るならいいんじゃね。

790 名前:デフォルトの名無しさん [2008/04/20(日) 00:46:08 ]
数学界ってネタ切れなんかね



791 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 05:25:06 ]
TAPLに数学なんか関係あったか? どのへん?

792 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 07:19:16 ]
数学は万物と関係があります

793 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 08:26:36 ]
確かにそうだが随分とアバウトな答え方だね

794 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 09:45:15 ]
本の最初のLessonで
main = do cs <- getContents
putStr cs
というサンプルがあったのだが,このまま打ち込んでも
The last statement in a 'do' construct must be an expression
と出る.どうすれば...?

795 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 12:09:38 ]
>>794
二行目の先頭にちょうど10個のスペースを入れてる?

796 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 15:58:12 ]
>>794
ttp://www.ice.nuie.nagoya-u.ac.jp/~h043078b/wiki/wiki.cgi?page=%CA%B8%CB%A1%BB%F6%B9%E0+-Haskell-#p19

797 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:41:46 ]
>>795-796
Emacsを使ってるのですが,するとEmacsの自動インデント
機能に難ありということなのでしょうか...

798 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:51:23 ]
>>797
Emacsはよく知らんが、Tabをスペースにかえればいいんでないの?


799 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:55:19 ]
関数型プログラミング言語Haskell Part7
pc11.2ch.net/test/read.cgi/tech/1174211797/

213 :デフォルトの名無しさん:2007/04/07(土) 18:00:15
すいません。emacsのhaskell-modeでプログラムしているんですが、
インデントの方法に関して質問があります。

例えば、次の様なソースがあった時、
import System
import System.IO
main = do
putStrLn $ "Woud you like some coffee?(y/n)."
hFlush stdout
c <- getChar
if c == 'y'
then putStrLn "Yes,please."
else putStrLn "No,thank you."

thenやelseの前でTabキーを押すと、if式と同じインデントになってしまうのですが、
それだとコンパイルエラーになってしまいます。なので、今はスペースでインデントを
付けています。Tabキーで正しくインデントさせる方法がありますでしょうか?


800 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 22:56:16 ]
関数型プログラミング言語Haskell Part7
pc11.2ch.net/test/read.cgi/tech/1174211797/

215 :デフォルトの名無しさん:2007/04/07(土) 19:31:19
>213
明示的に {} を使うという方法はあるにはあるが。
do { putStrLn $ "Woud you like some coffee?(y/n)."
; hFlush stdout
; c <- getChar
; if c == 'y'
then putStrLn "Yes,please."
else putStrLn "No,thank you."
}
のようにすると綺麗にインデントできる。

まぁ私は手で空白を入れたり一行にしちゃったりする方が多いけれど。



216 :デフォルトの名無しさん:2007/04/08(日) 17:57:02
>>215
レスありがとうございます。
{}を使う方法か、手動でインデントをあわせる方法の2通りという事ですね。

他の方はどうやってインデントさせているのか疑問に思っていたのですが、
その疑問が解消されました。





801 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 02:56:48 ]
Tabをもう一回押すんだよ。

802 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:05:24 ]
www.fobj.com/hisa/d/20060828.html






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<201KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef