[過去ログ]
関数型プログラミング言語Haskell Part7 (1001レス)
関数型プログラミング言語Haskell Part7 http://echo.5ch.net/test/read.cgi/tech/1174211797/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
819: デフォルトの名無しさん [sage] 2007/08/17(金) 23:20:06 すいません。教えてください。 今、haskellで囲碁のプログラムを組んでいるのですが、 石の塊(連という)の座標の集合を求める関数を書こうとして躓いてしまいました。 C++で書くと以下のようになります。 void getRen(const IgoBoard &board,Point point,Stone stone ,set<Point> & ren) { if(stone == board.getStone(point) && ! ren.include(point)) { ren.insert(point); getRen( board , Point(point.x+1,point.y ) , stone , ren ); getRen( board , Point(point.x-1,point.y ) , stone , ren ); getRen( board , Point(point.x ,point.y+1) , stone , ren ); getRen( board , Point(point.x ,point.y-1) , stone , ren ); } } 問題 ren の部分をどう書くかです。 haskellはポインタや参照が無いし、一度代入した値を変更することもできないらしいので 探索の先々で同じrenを使う方法がわから無いのです。 haskellではどう書いたらよいですか。 http://echo.5ch.net/test/read.cgi/tech/1174211797/819
820: デフォルトの名無しさん [sage] 2007/08/17(金) 23:52:32 >>819 T型の値を変更する関数を書く代わりに、T型の値を受け取ってT型の値を返す関数を書くのが定石。 俺ならこんな感じで書く。 getRen :: IgoBoard -> Point -> Stone -> Set Point getRen board point stone = augmentRen point empty where augmentRen :: Point -> Set Point -> Set Point augmentRen (Point x y) ren | stone == boardGetStone board && not (member point ren) = augmentRen (Point x (y-1)) $ augmentRen (Point x (y+1)) $ augmentRen (Point (x-1) y) $ augmentRen (Point (x+1) y) $ insert point ren | otherwise = ren http://echo.5ch.net/test/read.cgi/tech/1174211797/820
822: 819 [sage] 2007/08/18(土) 11:03:32 >>820 ありがとうございます。 augmentRenを直列に並べるのは思いつかなかったです。 なぜか並列に並べなければいけないという思い込みがありました。 http://echo.5ch.net/test/read.cgi/tech/1174211797/822
823: 819 [sage] 2007/08/24(金) 23:54:16 819です。 囲碁のルールをhaskellで実装してみました。 (純碁なので上げハマを数える機能は実装してない。パスも未実装) http://www.uploda.net/cgi/uploader4/index.php?file_id=0000018533.udn ここはこう書くと処理が速くなるとか、 こうしたほうがエレガントだとかありましたら教えてください。 宜しくお願いします。 http://echo.5ch.net/test/read.cgi/tech/1174211797/823
828: 819 [sage] 2007/08/26(日) 15:34:26 すいません。また教えてください。 haskellは演算子を定義できるそうですが、Pointに+を定義しようとしたらコンパイルエラーになりました。 どうも、数値の+とかぶっているから駄目ぽいのですが回避する方法はあるでしょうか。 なお演算子を+++にしたら動きましたが、見た目がダサいので何とか+を使いたいです。 ============ソース=========== data Point = Point_new { x :: Int , y :: Int } deriving ( Show ) (+) :: Point -> Point -> Point a + b = Point_new ((x a)+(x b)) ((y a)+(y b)) main = putStrLn $ show $ ((Point_new 3 4 ) + (Point_new 5 7)) =============コンパイルエラー================== test.hs:5:24: Ambiguous occurrence `+' It could refer to either `+', defined at test.hs:5:2 or `+', imported from Prelude test.hs:5:38: Ambiguous occurrence `+' It could refer to either `+', defined at test.hs:5:2 or `+', imported from Prelude test.hs:7:43: Ambiguous occurrence `+' It could refer to either `+', defined at test.hs:5:2 or `+', imported from Prelude http://echo.5ch.net/test/read.cgi/tech/1174211797/828
831: 819 [sage] 2007/08/26(日) 19:58:45 >>829 >> 830 どちらの方法でもいけることを確認しました。 829の方法を採用させていただきたいと思います。 クラスについても勉強したいと思います。 ありがとうございました。 http://echo.5ch.net/test/read.cgi/tech/1174211797/831
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.042s