将 runhaskell 与命令行参数一起使用

Using `runhaskell` with command-line arguments

我有一个名为 "test.txt" 的文件,其中包含以下文本:

Good
Morning
Sir

和一个名为 "test.hs" 的文件,代码如下:

module Main where

import System.IO

main :: IO ()
main = interact f

f :: String -> String
f s = head $ lines s

以下命令...

cat test.txt | runhaskell test.hs

产出

Good


但是,我想在不依赖文件的情况下将参数显式传递给 runhaskell,例如:

echo "Good\nMorning\nSir" | runhaskell test.hs

并使用 Haskell 代码的文字字符串执行 runhaskell,例如:

echo "Good\nMorning\nSir" | runhaskell "module Main where\nimport System.IO\nmain :: IO ()\nmain = interact f\nf :: String -> String\nf s = head $ lines s"

这在技术上可行吗?

问题是 echo 将输出反斜杠 (\) 和 n 而不是新行。

您可以使用 -e flag [unix.com],此标志将:

-e enable interpretation of backslash escapes

所以我们可以将带有新行的字符串传递到 runhaskell 的输入通道:

echo <strong>-e</strong> -- "Good\nMorning\nSir" | runhaskell test.hs

注意cat test.txt | runhaskell test.hsuseless use of cat,您可以将其替换为:

runhaskell test.hs <strong>< test.txt</strong>

效率更高,因为我们不使用 cat 进程或管道来传递数据。