【发布时间】:2011-10-25 11:34:02
【问题描述】:
正如在其他地方多次提到的(例如1,2,...),haskell 中的脚本非常强大。
一个快速的方法也可以是ghc expression evaluation mode。这就是我发现自己越来越多地使用的东西(我真的很喜欢 ruby 中的这个功能)。
一个小示例任务:
“找出包含 HEAD 和特定修订版本之间的 git 差异的所有文件夹”
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 的方式!
旁注:命令行 foo 向导可能会对此嗤之以鼻,但我觉得使用 haskell 比使用 bash 脚本更舒服,所以这就是我想要使用的。
【问题讨论】:
-
对于字符串 → 字符串函数,我发现
interact不那么笨重:ghc -e "interact $ <String -> String func>"。这通常以ghc -e "interact $ unlines . map (<String -> String func>) . lines"结尾。 -
作为 git 和 Haskell 的粉丝,他不是一个“命令行-foo 向导”,在博客文章中列出一堆与 git 相关的 Haskell 脚本肯定会很有趣给我!
-
@MatrixFrog 不限于 git,但您可能仍然感兴趣:Scripting with GHCs Evaluation Mode