Можно ли передать аргументы в 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)
Конечно, вы можете создать временный файл и удалить его вручную, как(= )
делает внутренне.