Режим оценки выражений в 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.