高階言語を別の言語に翻訳するプログラムを完成させようとしていますが、実装しようとしているインターフェイスの処理に問題があります。
アイデアは、選択する数字をユーザーに尋ね、次にそれが数字かどうかを確認し、数字である場合は、翻訳する特定の用語を書くように求める行が続きます。
数値が 4 の場合、用語の置換を要求する行が追加されているため、翻訳関数は 1 ではなく 2 つの引数を取ります。したがって、ユーザーが前の引数に応じて入力を完了するために 3 行が必要です。答えますが、私のコードは番号を要求し、次の質問を出力して最初に直接戻り、最初の行を再度出力します。
input* (isDigit num) *から取得した Char の有効性をテストせず、数値 4 をキー入力した場合でも常にif(ord num /= 4)が True に等しいパスを選択することに気付きました!
これを整理するためにいくつかの方法を試しましたが、迷っています。他に考えられないので、より良いアプローチを知っていれば、インターフェイス コードを完全に変更できてうれしいです。
ところで、私は Haskell に関してかなり素人です。
main :: IO ()
main = do
putStrLn "Choose a definition to be implemented:\n 1 - Def 1 dealing with a Generalised class of CRS terms without permutations,\n 2 - Def 2 which is an extension of Def 1 with permutations,\n 3 - Def 4 which takes a closed nominal term-in-context, returning a closed CRS (meta)term,\n 4 - Def 6 which extends on Def 4 by adding a ground nominal substitution to the arguments.\n Definition number: "
num <- getChar
unless (isDigit num) (return ())
def num
main
def :: Char -> IO String
def num = do
putStrLn "write a nominal term-in-context: "
hFlush stdout
str <- getLine
case num of
'1' -> (return . readExp1) str
'2' -> (return . readExp2) str
'3' -> (return . readExp4) str
'4' -> do
putStrLn "write a nominal term and the variable it substitutes:"
sub <- getLine
let term = readExp6 str (readSub sub)
return term
{- reads and ouputs type TrmCxt ((atm,Var),Trm) -}
readExp1 :: String -> String
readExp1 s = case (inputL parseT s) of
Left err -> "error: " ++ err
Right (fc , t) -> show $ translate1 [] fc t
入力を解析し、翻訳関数を呼び出す関数readExp1をスニペットに追加して、翻訳関数が何を行い、何を返すかを理解できるようにしました。他のものは、戻り値の型が同等です。