[過去ログ] 関数型プログラミング言語Haskell Part7 (1001レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
819
(5): 2007/08/17(金)23:20 AAS
すいません。教えてください。
今、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 );
省9
820
(2): 2007/08/17(金)23:52 AAS
>>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)) $
省5
822: 819 2007/08/18(土)11:03 AAS
>>820
ありがとうございます。
augmentRenを直列に並べるのは思いつかなかったです。
なぜか並列に並べなければいけないという思い込みがありました。
823: 819 2007/08/24(金)23:54 AAS
819です。
囲碁のルールをhaskellで実装してみました。
(純碁なので上げハマを数える機能は実装してない。パスも未実装)

外部リンク[php]:www.uploda.net

ここはこう書くと処理が速くなるとか、
こうしたほうがエレガントだとかありましたら教えてください。
宜しくお願いします。
828
(1): 819 2007/08/26(日)15:34 AAS
すいません。また教えてください。
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))
省13
831: 819 2007/08/26(日)19:58 AAS
>>829 >> 830
どちらの方法でもいけることを確認しました。
829の方法を採用させていただきたいと思います。
クラスについても勉強したいと思います。
ありがとうございました。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.033s