gpt4 book ai didi

haskell - Frege 等效于 Haskell 的 getLine 并读取

转载 作者:行者123 更新时间:2023-12-03 20:49:18 25 4
gpt4 key购买 nike

是否有任何 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 答案。

最佳答案

更新: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)
  • 功能 print , println , putStr , putChar写信给 stdout
  • getChargetLine读自stdin并在文件末尾抛出异常。
  • Java 类的 Frege 等价物,如 PrintWriter , BufferedWriter等在模块 Java.IO 中定义,这是自动导入的。有了这个,更多的基本功能得到了支持。例如,BufferedReader.readLine返回类型为 IO (Maybe String)并通过返回 Nothing 来表示文件结束,就像它的 Java 对应物一样,它返回 null在这种情况下。

  • 这是一个实现基本 grep 的简短示例程序:
    --- 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

    由于 Frege 还很新,尽管在最基本的领域(如 Lists 和 Monads)已经取得了进展,但承认仍然缺乏对库的支持。

    此外,虽然意图是对 Haskell 有高度的兼容性,特别是在 IO 系统和一般在低级系统相关的主题中,但存在一种张力:我们是宁愿走 Java 的方式还是应该真正尝试模仿 Haskell 的方式(这又明显受到标准 C/POSIX 库中可用内容的影响)。

    反正 IO 的东西可能是 Frege 库最不发达的领域,可惜了。这也是因为它相对容易快速地为少数 Java 方法编写 native 函数声明,人们需要以一种特别的方式,而不是花时间开发一个完善的库。

    此外,目前还不存在 Read 类。作为解决此问题之前的替代品,String 类型具有解析所有数字类型的函数(基于 Java parseXXX() 方法)。

    (旁注:因为我的日子也只有 24 小时,而且我有一个家庭、一条狗和一份工作要关心,所以我很高兴有更多的贡献者来帮助改进 Frege 系统。)

    关于您的代码:是的,我认为通过 Reader 和 Writer 接口(interface)进行所有基于字符的 I/O 是正确的。您的示例还表明,需要获得标准输入阅读器的便利功能。标准输出编写器也是如此。

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

    关于haskell - Frege 等效于 Haskell 的 getLine 并读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9467071/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com