haskell中的表达式评估模式用于脚本编写

oli*_*ver 15 git scripting haskell

正如别处指出多次(例如,1,2,...)在Haskell脚本可以说是相当强大的.
快速方法也可以是ghc表达式评估模式.这就是我实际上发现自己越来越多地使用(我真的很喜欢ruby中的这个功能).
一个小例子任务:
"找出包含HEAD和特定修订版之间的git差异的所有文件夹"

git diff --stat 9e2b68 | ghc -e \
  "getContents >>= return.(Data.List.nub).map(fst.break('/'==).head.words).lines"
Run Code Online (Sandbox Code Playgroud)

这看起来有点笨重,可能是因为我真的不知道使用的细节ghc -e.
鉴于所有有趣的部分只是nub.map(fst.break('/'==).head.words).lines实际的表达似乎有点罗嗦.

  • 我如何告诉ghc我需要使用的模块,所以我不需要使用全名来限定它们?
  • 我可以让ghc选择某种包含我经常使用的模块的配置文件吗?

我真的很感激从其他用例中看到一些例子,这些例子将有助于我改进我对这些小脚本使用haskell的方式!

旁注:Commandline-foo向导可能会对此嗤之以鼻,但我觉得使用haskell然后使用bash脚本更加舒服,所以这就是我想要使用的内容.

Fun*_*lad 8

关于模块:ghc -e使用你的~/.ghci文件,所以在这种情况下,你要添加:m +Data.List它(import Data.List(nub)从GHC 7左右开始也支持).

关于包:您可以使用ghc-pkg hide somepackageghc-pkg expose somepackage定义默认的可见包集(默认情况下会显示包;也许我会误解您的问题).

您可能会发现eddie很有用.


Has*_*ant 5

就像FunctorSalad所说的那样,ghc -e加载~/.ghci 它可以使用它来添加你可能在脚本中使用的任何样板.在你的情况下你可以添加

let script f = getContents >>= return f
import Data.List
Run Code Online (Sandbox Code Playgroud)

给你~/.ghci文件,然后运行:

git diff ... | ghc -e "script.nub.map(fst.break(=='/').head.words).lines"
Run Code Online (Sandbox Code Playgroud)


Dan*_*her 5

除了.ghci文件的标准配置(除了你的全局〜/ .ghci,你可以在某些目录中有专门的.ghci文件,然后在那之前读取),你也可以传递一个Haskell源文件作为命令行参数ghc -e "expression" path/to/Source.hs.expression然后将在上下文中进行评估module Source.