スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Haskell]BufferMode

思わぬところでハマったので。

telnetで繋ぐと計算問題が出題・それに回答というようなものを
目指して書いていたのですが、何故か問題が表示されない。

出力がバッファリングされていたようです。

こちらのページを読んでて気づきました。

「hSetBuffering」で解決しました。

import Network
import System.IO
import Data.Char (isSpace)
import System.Random
import Control.Monad

qnum = 3

main = withSocketsDo $ do
socket <- listenOn $ PortNumber 9999
(handle, hostname, port) <- accept socket
hSetBuffering handle NoBuffering
question handle 1
hClose handle
sClose socket

question h count = do
a <- getStdRandom (randomR (1, 99))
b <- getStdRandom (randomR (1, 99))
opi <- getStdRandom (randomR (0, 3))
let op = ['+', '-', '*', '/'] !! opi
hPutStr h $ "Q" ++ (show count) ++ " : " ++ (show a) ++ [' ', op, ' '] ++ (show b) ++ " = "
ans <- hGetLine h
if trim ans == show (calc op a b)
then hPutStrLn h "OK!"
else hPutStrLn h "NG!"
when (count < qnum) (question h $ count + 1)

calc :: Char -> Int -> Int -> Int
calc op a b | op == '+' = a + b
| op == '-' = a - b
| op == '*' = a * b
| op == '/' = a `div` b

trim = reverse . dropWhile isSpace . reverse

最後の「trim」はこちらのページから拝借させていただきました。

コメントの投稿

非公開コメント

プロフィール

jou4

Author:jou4
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。