我是Haskell的新手,我意识到我可能会在这里逆流而上,但是我会问:
假设我有一个简短的Haskell脚本:
import Data.List.Split (splitOn)
main :: IO ()
main = do
let orders = splitOn "x" "axbxc"
putStrLn $ head orders
如果仅使用标准函数,则可以使用进行编译ghc <script.hs>
。因为我依靠split
软件包来提供splitOn
功能,所以编译失败。
现在,我毫不费力地设置了带有project.cabal
和Setup.hs
文件的cabal项目,以使其能够实际编译。但是,对于独立脚本来说,这感觉像是很多额外的样板。
因此,有没有办法针对某个外部软件包编译单个.hs文件?类似于Python中的操作pip install something
,可以通过“将程序包安装到解释器中”来完成,即是否可以将额外的程序包“安装到ghc中”,所以例如我只需要提供一些到ghc的额外链接标志?
如果使用Stack,最简单的方法是编写一个“ Stack脚本”,这是一个Haskell文件,在第一行中包含对所需软件包的描述(实际上是调用stack
指定适当的命令行参数)。一个示例(从docs稍作修改):
$ cat turtle-example.hs
-- stack --resolver lts-6.25 script --package turtle
{-# LANGUAGE OverloadedStrings #-}
import Turtle
main = echo "Hello World!"
$ stack ./turtle-example.hs
Completed 5 action(s).
Hello World!
$ stack ./turtle-example.hs
Hello World!
该脚本使用turtle
包;运行时,Stack下载并构建此依赖项,然后在脚本中可用。(请注意,它turtle
已经第二次运行了,因此不再需要重新构建。)
碰巧的是,--package
Stack中的命令不仅限于脚本。它也可以与其他Stack命令一起使用!例如,要编译程序,您应该可以运行stack ghc --resolver lts-16.27 --package split -- -ghc-options your-program-name.hs
。并stack ghci --package split
会在可能的地方给您GHCi提示import Data.List.Split
。
(注意:这个答案只针对Stack,而不是Cabal,因为我不太了解Cabal。但是,我相信所有这些都可以使用Cabal来完成。例如,我知道Cabal与我上面提到的Stack脚本,尽管我暂时不记得语法。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句