Подтвердить что ты не робот

Можно ли напрямую вызывать код Haskell из Bash и выводить на stdout?

Можно выводить на стандартный вывод Haskell с одним слоем, например

main = print "Hello World"

непосредственно из Bash? Что-то ala php -r 'echo "Hello World\n";'

Я ткнул в опции ghc, но я не видел ничего, что могло бы помочь мне.

4b9b3361

Ответ 1

Я думаю, что я понял это здесь

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

UPDATE:

сделал еще несколько тестов, это тоже работает:

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

Ответ 2

Рассмотрим команду runhaskell, которая может принимать piped stdin, например, так:

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

Обновление

В общем случае вы можете script источник Haskell следующим образом:

#!/usr/bin/env runhaskell

main = putStrLn "Hello World"

Это фактически компилирует и выполняет программу, тогда как ghc -e будет оценивать выражение.

Ответ 3

Вы нашли ghc -e самостоятельно. Вот несколько полезных алиасов, которые хорошо сочетаются с этим:

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

(Обсуждается в этом старом блоге.)

Ответ 4

Я написал eddie (https://eddie.googlecode.com/), чтобы предоставить больше возможностей, чем "-e". На связанной странице:

Эдди добавляет функции, позволяющие упростить его использование для сценариев оболочки:

Когда заданы аргументы файла, eddie передает их в вашу функцию. Эдди может легко добавлять модули в пространство имен, которое вы используете. У Eddie есть опции для обработки строк или файлов одновременно. Eddie будет использовать методы ввода-вывода двоичного файла при запросе.

Будьте предупреждены, что eddie был моим первым "настоящим" приложением haskell и серьезно нуждается в переписывании.