2

Pipes.Concurrent を使用して、GTK で短い GUI プログラムを作成しています。マインスイーパ風のゲームなので、ボタンのグリッドを作成しています。

ボタンを作成して接続します。

b <- buttonNewWithLabel (show $ adjacencies board ! i)
on b buttonActivated 
     $ void . atomically $ send output (ClickSignal i (mines board ! i))
return b

そして、パイプを次のように接続します。

(output, input)  <- spawn (latest (ClickSignal 0 False))

let run = do
        sig <- await
        case sig of
            ClickSignal i isMine ->
                if isMine
                then do
                    lift $ labelSetText info (show i ++ " -- LOSE!")
                else do 
                    lift $ labelSetText info (show i ++ " -- Ok")
                    run
            Empty -> do
                lift $ labelSetText info "Empty Case"
                run

void . forkIO $ do 
    runEffect $ fromInput input >-> run
    performGC

ほぼ期待通りに動いています。しかし、ボタン 1 をクリックしても何も起こりません。しかし、ボタン 23 を押すと、情報ラベルが「1..」に更新されます。別のボタンをクリックすると、「23..」などに更新されます。

並行パイプがどのように機能するかを理解できていないか、遅延 IO が何か変なことをしているのではないかと思います。

4

1 に答える 1