[表示 : 全て 最新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の仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。

51 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:39:33 ]
>>49
読んだ 少し分かったような分からないような…?
YOUはIOモナドを使った関数も参照透明だよって言ってるけど
標準入力読んだときとか乱数生成したときとか同じ引数あげても同じ値が返ってくるとは
限らないじゃん それって困るんじゃないの? って思うの

>>50
>>49の説明と合わせたらちょっと分かったかも
そーいえばリストもモナドなんだったっけ
例示してくれた1.2.3.の例はHaskellとして正しい文法なん?
言いたい意味はわかるけどそういう書き方があるの?
前スレ952が教えてくれたサイトやら見てみたけどわかんない…

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回の初期化時の変更のみということで。







[ 続きを読む ] / [ 携帯版 ]

前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