Режим оценки выражений в haskell для сценариев - PullRequest
15 голосов
/ 25 октября 2011

Как уже неоднократно отмечалось в других местах (например, 1 , 2 , ...), сценарии в haskell могут быть довольно мощными.
Быстрый способ также может быть режим оценки выражения ghc . это то, что я на самом деле использую все больше и больше (мне действительно нравится эта функция в ruby).
Небольшой пример задачи:
«Найти все папки, содержащие git diffs между 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: Мастера командной строки-foo, вероятно, будут смеяться над этим, но я чувствую себя гораздо более комфортно, используя haskell, чем сценарии bash, так что это то, что я хочу использовать.

Ответы [ 3 ]

8 голосов
/ 25 октября 2011

Относительно модулей: ghc -e использует ваш файл ~/.ghci, поэтому в этом случае вы добавите к нему :m +Data.List (import Data.List(nub) также поддерживается начиная с GHC 7 или около того).

Относительно пакетов: Вы можете использовать ghc-pkg hide somepackage и ghc-pkg expose somepackage для определения набора видимых пакетов по умолчанию (хотя пакеты выставляются по умолчанию; возможно, я неправильно понимаю ваш вопрос).

Вы можете найти eddie полезно.

5 голосов
/ 25 октября 2011

В дополнение к стандартной конфигурации для файла .ghci (кроме ваших глобальных ~ / .ghci вы можете иметь специализированные файлы .ghci в некоторых каталогах, которые затем будут прочитаны до этого), вы также можете передать Haskellисходный файл в качестве аргумента командной строки, ghc -e "expression" path/to/Source.hs.expression будет затем оцениваться в контексте module Source.

5 голосов
/ 25 октября 2011

Как сказал FunctorSalad, ghc -e загружает ~/.ghci, так что вы можете использовать его, чтобы добавить любой шаблон, который вы можете использовать в своем скрипте.В вашем случае вы можете добавить

let script f = getContents >>= return f
import Data.List

к вашему ~/.ghci файлу и затем запустить:

git diff ... | ghc -e "script.nub.map(fst.break(=='/').head.words).lines"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...