Разреживание и переименование пакетов для ghci и скриптов - PullRequest
1 голос
/ 02 июля 2019

Для сценариев и игры в ghci я хочу импортировать Data.Matrix из пакета matrix. База уже содержит Data.Matrix, но из другой упаковки: matrices.

Мне удалось обойти это успешно с PackageImports: Для ghci я делаю:

$ stack exec --resolver lts-12.5 --package "matrix" -- ghci
Prelude> :set -XPackageImports
Prelude> import "matrix" Data.Matrix

и для скриптов:

#!/usr/bin/env stack
-- stack --package matrix

{-# LANGUAGE PackageImports #-}

import "matrix" Data.Matrix

main = putStrLn $ Data.Matrix.prettyMatrix 
                $ Data.Matrix.fromList 1 1 [1]

выполнено с stack ghc script.hs; ./script.hs

Но документация гласит: «Вам, вероятно, не нужно использовать это ... См. Также« Истончение и переименование модулей »для альтернативного способа ...»

Там , предлагается использовать, например. -package "base (Data.Bool as Bool)" поэтому я хотел попробовать это и решил, что для моего случая это будет что-то вроде

  • -package "base (Data.Matrix as Mx)", чтобы переименовать существующее, которое я хочу игнорировать, или

  • -package "matrix (Data.Matrix as Mx)", чтобы добавить пользовательское имя для модуля, который я хочу.

Но я даже не могу заставить пример работать:

stack exec -package "base (Data.Bool as Bool)" -- ghci
Invalid option `-package'

Did you mean this?
    --package
...

stack exec --package "base (Data.Bool as Bool)" -- ghci
The following errors occurred while parsing the build targets:
- Directory not found: (Data.Bool
- Directory not found: Bool)

stack exec -package base (Data.Bool as Bool) -- ghci
bash: syntax error near unexpected token `('

Для сценариев

#!/usr/bin/env stack
(I've tried each of those separately)
-- stack  -package "base (Data.Bool as Bool)" 
-- stack  -package  base (Data.Bool as Bool)
-- stack --package "base (Data.Bool as Bool)"
-- stack --package  base (Data.Bool as Bool)

import Bool

main = putStrLn $ show True

не компилируется (stack ghc script2.hs)

[1 of 1] Compiling Main             ( script2.hs, script2.o )

script2.hs:4:1: error:
    Could not find module ‘Bool’
    Use -v to see a list of the files searched for.
  |
4 | import Bool
  | ^^^^^^^^^^^

1 Ответ

2 голосов
/ 02 июля 2019

Все, что вы найдете в руководстве по GHC , касается либо параметров компилятора GHC , либо самого кода на Haskell.Но вы используете Stack для управления пакетами, а это совершенно другой зверь.(Конечно, он вызывает GHC, но это намного больше, чем это.)

При использовании стека нет причин баловаться с PackageImports (если только вам действительно не нужно импортировать два модуля вместеодно и то же имя из разных пакетов!).По умолчанию Stack скрывает каждый пакет, который явно не является зависимостью, поэтому не нужно ничего переименовывать;просто используйте обычные параметры стека для указания пакетов и простой импорт в фактический Haskell:

#!/usr/bin/env stack
-- stack --resolver lts-12.5 runghc --package matrix

import Data.Matrix as M

main = putStrLn . prettyMatrix
                $ M.fromList 1 1 [1]

Убедитесь, что stack действительно использует строку распознавателя, т.е. либо

$ chmod +x matrixtest.hs
$ ./matrixtest

, либо

$ stack matrixtest.hs

но не stack ghc matrixtest.hs или что-то в этом роде.

...