Можно ли передать аргументы в runhaskell с помощью Heredoc?

Я хотел бы передать строку «Hello World» следующему сценарию Haskell:

      main :: IO ()
main = interact id

который находится внутри Heredoc. Это возможно ?

Я сделал минимальный воспроизводимый пример (в настоящее время не работает):

      #!/bin/bash
echo "Hello World" | runhaskell <<HASKELL_END 2>/dev/null
main :: IO ()
main = interact id

1 ответ

Вы можете сделать это, если можете использовать zsh.

      #!/bin/zsh
echo "Hello World" | runghc =(cat <<'HASKELL_END'
main :: IO ()
main = interact id
HASKELL_END
)

или

      #!/bin/zsh
echo "Hello World" | runghc =(<<<'
main :: IO ()
main = interact id'
)

Дело в том, что вам нужно передать исходный код в виде файла, посколькуinteractзакрывает стандартный ввод. К сожалению, замена процесса в bash не работает, поскольку ghc пытается получить размер именованного канала.

Так что это не работает.

      #!/bin/bash
echo "Hello World" | runghc <(cat <<HASKELL_END
main :: IO ()
main = interact id
HASKELL_END
)

Выдает эту ошибку.

      *** Exception: /dev/fd/63: hFileSize: inappropriate type (not a regular file)

Конечно, вы можете создать временный файл и удалить его вручную, как(= )делает внутренне.

Другие вопросы по тегам