【问题标题】:Is it possible to directly invoke Haskell code from Bash and output to stdout?是否可以直接从 Bash 调用 Haskell 代码并输出到标准输出?
【发布时间】:2014-10-17 02:51:15
【问题描述】:

可以将简单的 Haskell 单线输出到标准输出,例如

main = print "Hello World"

直接来自 Bash?好东西php -r 'echo "Hello World\n";'

我在ghc 选项中四处寻找,但没有看到任何对我有帮助的东西。

【问题讨论】:

    标签: bash haskell command-line


    【解决方案1】:

    您自己找到了ghc -e。以下是一些与之相匹配的有用别名:

    function hmap { ghc -e "interact ($*)";  }
    function hmapl { hmap  "unlines.($*).lines" ; }
    function hmapw { hmapl "map (unwords.($*).words)" ; }
    

    (在我的old blog post 中讨论过。)

    【讨论】:

      【解决方案2】:

      我想我明白了from here

      $ ghc -e "interact (unlines.map reverse.lines)"
      hello
      olleh
      

      更新:

      刚刚做了一些测试,这也有效:

      echo "hi" | ghc -e "interact (unlines.map reverse.lines)"
      // prints "ih"
      

      【讨论】:

        【解决方案3】:

        考虑runhaskell 命令,它可以采用管道标准输入,例如这样,

        echo 'main = print "Hello World"' | runhaskell
        

        更新

        一般而言,您可以按如下方式编写 Haskell 源代码,

        #!/usr/bin/env runhaskell
        
        main = putStrLn "Hello World"
        

        这实际上编译并执行程序,而ghc -e 将评估一个表达式。

        【讨论】:

        • 刚刚试了一下,与ghc -e相比,它的运行速度似乎超级慢,我想知道这是为什么?当我用time 对它进行基准测试时,main = print "Hello" | runhaskell 使用了1.371s,而ghc -e '"Hello"' 使用了.207s
        • 使用 ghc -e 也会加载 .ghci 配置,但 runhaskell 不会。
        • 知道了,我想大多数时候我会寻找ghc -e,但很高兴知道如果我需要runhaskell(例如@987654333)我可以做多行@)
        【解决方案4】:

        我写了 eddie (https://eddie.googlecode.com/) 来提供比“-e”更多的功能。从链接页面:

        Eddie 添加了一些功能,使其更容易用于 shell 脚本:

        当给定文件参数时,eddie 将它们提供给您的函数。 Eddie 可以轻松地将模块添加到您使用的命名空间中。 Eddie 可以选择一次处理一行或一个文件。 Eddie 将在被要求时使用二进制文件 IO 方法。

        请注意,eddie 是我的第一个“真正的”haskell 应用程序,非常需要重写。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-03
          • 2015-12-25
          相关资源
          最近更新 更多