【问题标题】:Expression evaluation mode in haskell for scriptinghaskell中用于脚本的表达式评估模式
【发布时间】: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

标签: git haskell scripting


【解决方案1】:

关于模块:ghc -e 使用您的 ~/.ghci 文件,因此在这种情况下,您需要将 :m +Data.List 添加到其中(自 GHC 7 左右起也支持 import Data.List(nub))。

关于包:您可以使用ghc-pkg hide somepackageghc-pkg expose somepackage 来定义默认的可见包集(虽然包是默认公开的;也许我误解了你的问题)。

您可能会发现eddie 很有用。

【讨论】:

  • 对 .ghci 文件的良好调用!不知道ghc -e 使用的是同一个文件。
  • 关于包裹:不,隐藏和暴露不是我的意思。
  • 关于 eddie:看起来真的很不错……甚至还有一个 cabal 安装选项。还没有完全弄清楚如何将文本传送到它,但我会调查的!顺便说一句...FunctorSalad...非常有创意的名字:)
【解决方案2】:

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

【讨论】:

  • 酷...不知道在当前目录中有一个特殊的 .ghci 文件的选项。
【解决方案3】:

就像 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"

【讨论】:

  • +1:我想知道((==)/) 在问题中应该是什么意思。
  • 不错!这真的很有用!谢谢你的提示!允许更顺畅的集成...
  • ((==)'/')('/'==) 相同。
  • @augustss ,这是真的,我只是复制粘贴了问题中的内容,我将对其进行更改,以便更具可读性...
  • @augustss 感谢您指出这一点……'s 这对当然不见了。而且你的中缀符号更短更顺眼!
猜你喜欢
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 2013-10-16
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
相关资源
最近更新 更多