Haskell 是否可以通过标准输入将源代码传输到GHC?

Haskell 是否可以通过标准输入将源代码传输到GHC?,haskell,ghc,Haskell,Ghc,我的意思是这样的: echo 'main = print 1' | ghc > executable GHC回复的内容:GHC:无输入文件 我错过什么了吗?这有可能吗?通常ghc用作编译器,您可以在文件上运行它(ghc可以在文件上查找并从结尾等推断类型),并将输出文件指定为标志 当然,您可以使用 filename=$(mktemp --suffix=.hs) echo "main = print 1" >> $filename ghc -o executable $filen

我的意思是这样的:

echo 'main = print 1' | ghc > executable
GHC回复的内容:
GHC:无输入文件


我错过什么了吗?这有可能吗?

通常ghc用作编译器,您可以在文件上运行它(ghc可以在文件上查找并从结尾等推断类型),并将输出文件指定为标志

当然,您可以使用

filename=$(mktemp --suffix=.hs)
echo "main = print 1" >> $filename
ghc -o executable $filename 

据我所知,答案是否定的。我的尝试:

  • $echo'main=print 1'| ghc
    ghc:无输入文件

  • $echo'main=print 1'| ghc-
    ghc:无法识别的标志:-

  • $echo'main=print 1'| ghc/dev/stdin
    目标'/dev/stdin'不是模块名或源文件

  • $ln-s/dev/stdin stdin.hs;echo‘main=print 1’| ghc stdin.hs
    stdin.hs:hFileSize:类型不正确(不是常规文件)


  • 问题:ghc使用
    .hs
    .lhs
    .o
    等后缀来决定如何处理文件(这就是#3失败的原因)。即使你破解了这个(#4),ghc也确实希望
    stat()
    文件以获得其大小,这在管道上是失败的。

    尽管这在普通情况下是不可能的,但zsh提供了一种新的方法,允许“文件”比传统的进程替换更像真实的文件(通过创建一个实际的临时文件):

    %ghc-o Main-x hs=(echo'Main=print 1')
    [1/1]编译Main(/tmp/zshjlS99o,/tmp/zshjlS99o.o)
    链接主。。。
    %/主要
    1.
    % 
    
    -x hs
    选项告诉
    ghc
    就像给定的文件名以
    .hs
    结尾一样

    总的来说,这本质上是手动创建和删除临时文件的快捷方式


    我不确定是否还有其他外壳支持这种东西。至少我不认为bash会这样做。

    这对runghc有效,但不会创建可执行文件。您实际上想要实现什么?运行一些Haskell代码,或者将其编译成独立的二进制代码?根据您的目标,可能有比手动调用GHC二进制文件更简单的方法。更简单的4:
    echo'main=print 1'| GHC-x hs/dev/stdin
    我现在将此标记为一个解决方案,因为这是实现我所寻找的最简洁的方法。如果有人发布了一个在zsh之外工作的类似简洁版本(例如,我尝试了
    ghc-o executable$(echo“main=print 1”| mktemp--suffix=.hs)
    ,但没有成功),或者ghc在内部实现了支持,那么我将相应地更改我的答案。