スポンサーサイト

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

逆ポーランド関数電卓

Haskell で逆ポーランド型の関数電卓(試作品)を作ってみました。
javaとかと違ってエラーを考慮して、型を定義しないといけないのでそれがちょっと面倒ですが、
面倒なのはそのくらいで基本的には楽にかけました。


{-
- 逆ポーランド型関数電卓
-
-}
import System.IO
import Data.Either
import Data.String
import Data.Maybe
import Data.List
import Data.Char

main :: IO()
main = getLine >>= calc
calc :: String -> IO()
calc str
| str == "q" = putStrLn str
| otherwise = putStrLn (calcCore ( parse $ words str)) >> main


parse :: [String] -> [Either String (Maybe Int)]
parse = map parse'
where
parse' :: String -> Either String (Maybe Int)
parse' str
| all isDigit str = Right (Just (read str))
| otherwise = Left str


calcCore :: [Either String (Maybe Int)]-> String
calcCore a = show $ head $ snd $ calcCore' (a,[])

calcCore' :: ([Either String (Maybe Int)],[Maybe Int]) -> ([Either String (Maybe Int)],[Maybe Int])
calcCore' ([],n) = ([],n)
calcCore' ((a:as), n) = calcCore' (as, (either (f1 n) (f2 n) a))

-- 演算子が入った時に演算する
f1 :: [Maybe Int] -> String -> [Maybe Int]
f1 (a:as) b = calc'' b a ( head as):tail as

-- スタックに積み込む
f2 :: [Maybe Int] -> Maybe Int -> [Maybe Int]
f2 a b = b:a


calc'' :: String -> Maybe Int -> Maybe Int -> Maybe Int
calc'' c (Just a) (Just b)
| c == "+" = Just ((+) a b)
| c == "-" = Just ((-) a b)
| c == "*" = Just ((*) a b)
| otherwise = Nothing
calc'' _ Nothing _ = Nothing
calc'' _ _ Nothing = Nothing

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

かみさまみならい

Author:かみさまみならい
FC2ブログへようこそ!

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

この人とブロともになる

ブログ内検索
RSSフィード
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。