Frege相当于Haskell的getLine和read

时间:2012-02-27 14:54:39

标签: haskell functional-programming jvm-languages frege

是否有任何Frege相当于Haskell的getLineread来解析标准库中控制台的输入?

目前我这样做:

import frege.IO

getLine :: IO String
getLine = do
 isin <- stdin
 isrin <- IO.InputStreamReader.new isin
 brin <- IO.BufferedReader.fromISR isrin
 line <- brin.readLine
 return $ fromExceptionMaybe line

fromExceptionMaybe :: Exception (Maybe a) -> a
fromExceptionMaybe (Right (Just r)) = r
fromExceptionMaybe (Right _) = error "Parse error on input"
fromExceptionMaybe (Left l) = error l.getMessage

pure native parseInt java.lang.Integer.parseInt :: String -> Int

main _ = do
 line <- getLine
 println $ parseInt line

更新

弗雷格已经发展,所以现在我们在标准库中有getLine。至于read,我们在String上有转换方法。现在最初的问题很简单,

main _ = do
  line <- getLine
  println line.atoi

有关详细信息,请参阅Ingo的答案。

1 个答案:

答案 0 :(得分:12)

更新:更新版本的Frege

中的I / O支持

从版本3.21.80开始,我们在标准库中有更好的I / O支持:

  • 运行时提供stdoutstderr(缓冲,UTF8编码java.io.PrintWriters缠绕java.lang.System.outjava.lang.System.err)和stdin(UTF8解码) java.io.BufferedReader缠绕java.lang.System.in
  • 函数printprintlnputStrputChar写入stdout
  • getChargetLinestdin读取,并在文件末尾抛出异常。
  • PrintWriterBufferedWriter等Java类的Frege等效项在模块Java.IO中定义,模块BufferedReader.readLine会自动导入。有了这个,就支持更多基本功能。例如,IO (Maybe String)的返回类型为Nothing,并通过返回null来表示文件的结尾,就像它的Java副本一样,在这种情况下返回--- A simple grep module examples.Grep where --- exception thrown when an invalid regular expression is compiled data PatternSyntax = native java.util.regex.PatternSyntaxException derive Exceptional PatternSyntax main [] = stderr.println "Usage: java examples.Grep regex [files ...]" main (pat:xs) = do rgx <- return (regforce pat) case xs of [] -> grepit rgx stdin fs -> mapM_ (run rgx) fs `catch` badpat where badpat :: PatternSyntax -> IO () badpat pse = do stderr.println "The regex is not valid." stderr.println pse.getMessage run regex file = do rdr <- utf8Reader file grepit regex rdr `catch` fnf where fnf :: FileNotFoundException -> IO () fnf _ = stderr.println ("Could not read " ++ file) grepit :: Regex -> BufferedReader -> IO () grepit pat rdr = loop `catch` eof `finally` rdr.close where eof :: EOFException -> IO () eof _ = return () loop = do line <- rdr.getLine when (line ~ pat) (println line) loop 。 / LI>

这是一个实现基本grep的简短示例程序:

{{1}}

因为弗雷格仍然很新,尽管在最基本的领域已经取得了进展,但是仍然缺乏图书馆的支持,例如Lists和Monads。

此外,虽然目的是为了与Haskell具有高度的兼容性,特别是在IO系统中以及通常在低级系统相关主题中,但是存在一种紧张:我们应该选择Java方式还是我们应该真的试图模仿Haskell的方式(这显然会受到标准C / POSIX库中可用内容的影响)。

无论如何,不​​幸的是,IO事件可能是弗雷格图书馆中最不发达的地区。这也是因为以一种特殊的方式快速编写少数Java方法的本机函数声明相对容易,而不是花时间开发一个很好的库。

此外,到目前为止还没有Read类。作为替换之前,String类型具有解析所有数字类型的函数(基于Java parseXXX()方法)。

(旁注:因为我的日子也只有24小时,我有一个家庭,一只狗和一份工作要关心,我很乐意有更多的贡献者帮助改善弗雷格系统。)

关于你的代码:是的,我认为通过Reader和Writer接口完成所有基于字符的I / O是正确的。您的示例还显示需要用于获取标准输入读取器的便利功能。这同样适用于标准输出编写器。

但是,当你需要阅读超过1行时,我肯定会在main函数中创建阅读器并将其传递给输入处理操作。