我正在完成一个将高阶语言翻译成另一种语言的程序,但在处理我试图实现的接口时遇到了麻烦。
这个想法是它要求用户选择一个数字,然后检查它是否是一个数字,如果是,它后面跟着一行要求写出要翻译的给定术语。
如果数字是 4,它有一个额外的行要求替换术语,因此翻译函数需要 2 个 args 而不是 1。因此我希望有 3 行输入供用户完成,具体取决于前面回答,但是我的代码要求输入一个数字,然后打印下一个问题并直接返回到开头,再次打印第一行。
我注意到它不会测试从输入* (isDigit num) * 获取的 Char 的有效性,并且总是选择if(ord num /= 4)等于 True 的路径,即使我键入数字 4!
我已经尝试了几种方法来解决这个问题,但我迷路了。如果您知道任何更好的方法,我非常乐意完全更改我的界面代码,因为我想不出任何其他方法。
顺便说一句,我在 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,它解析输入并调用翻译函数,以便您了解它的作用和返回的内容。其他的返回类型是等价的。