Режим оценки выражений в haskell для скриптинга
Как отмечено несколько раз в другом месте (например, 1, 2,...) скрипты в haskell могут быть достаточно мощными.
Быстрый способ также может быть режим оценки выражения ghc. это то, что я на самом деле нахожу себя использующим все больше и больше (мне очень нравится эта функция в рубине).
Небольшая примерная задача:
"Узнайте все папки, содержащие git diff между HEAD и конкретной версией"
git diff --stat 9e2b68 | ghc -e \
"getContents >>= return.(Data.List.nub).map(fst.break('/'==).head.words).lines"
Это выглядит немного неуклюжим, возможно, потому, что я не знаю подробностей использования ghc -e
.
Учитывая, что вся интересная часть - это просто nub.map(fst.break('/'==).head.words).lines
, фактическое выражение кажется немногословным.
- Как сообщить ghc о модулях, которые мне нужно использовать, поэтому мне не нужно их квалифицировать, используя полное имя?
- Могу ли я заставить ghc забрать какой-то файл конфигурации, который содержит модули, которые я часто использую?
Мне бы очень хотелось увидеть некоторые примеры из других случаев, которые помогут мне улучшить способ использования haskell для этих небольших скриптов!
Sidenote: мастера Commandline-foo, вероятно, будут смеяться над этим, но я чувствую себя намного более комфортно, используя haskell, тогда bash scripting, так что это то, что я хочу использовать.
Ответы
Ответ 1
Относительно модулей: ghc -e
использует ваш файл ~/.ghci
, поэтому в этом случае вы должны добавить к нему :m +Data.List
(import Data.List(nub)
также поддерживается с GHC 7 или около того).
Что касается пакетов: вы можете использовать ghc-pkg hide somepackage
и ghc-pkg expose somepackage
для определения набора видимых пакетов по умолчанию (пакеты по умолчанию отображаются, возможно, я неправильно понимаю ваш вопрос).
Вы можете найти eddie полезный.
Ответ 2
Как сказал FunctorSalad, ghc -e
загружает ~/.ghci
, чтобы вы могли использовать его для добавления любого шаблона, который вы можете использовать в script. В вашем случае вы можете добавить
let script f = getContents >>= return f
import Data.List
вам ~/.ghci
, а затем запустите:
git diff ... | ghc -e "script.nub.map(fst.break(=='/').head.words).lines"
Ответ 3
В дополнение к стандартной конфигурации для файла .ghci(кроме ваших глобальных ~/.ghci, вы можете иметь специализированные файлы .ghci в некоторых каталогах, которые затем будут прочитаны до этого), вы также можете передать Haskell исходный файл в качестве аргумента командной строки, ghc -e "expression" path/to/Source.hs
. expression
затем будет оцениваться в контексте module Source
.