haskell-jp / beginners #18 at 2021-09-16 10:28:28 +0900

お久しぶりです。
昔に質問したと思うのですが、覚えていないのと自力解決を臨んでみたもののうまくいかなかったので質問します。
DP2.hs:12:1: error:
    Could not find module 'Data.Vector.Unboxed'
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
   |
12 | import qualified Data.Vector.Unboxed as U
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

DP2.hsstack runghc DP2.hs で走らせようとした時に生じたエラーメッセージです。

これに対し私は package.yamldependencies
Data を書き加えたのですが、全く同じエラーが出ます。
解決方法を求めます。お願いします。
@sirkerf こちらのドキュメント の左上を見ていただけるとわかると思うのですが、 Data.Vector.Unboxedvector というパッケージによって公開されているようです。ですので、追加すべきは Data でなく vector かと思われます。(Haskell の場合、 import 文に書くパッケージ階層はセマンティクスによる分類であって依存関係単位による分類ではないのですよね)
@TH
ありがとうございます。追加してみます。
dependencies:
- base >= 4.7 && < 5
- array
- bytestring
- containers
- random
- vector

package.yaml の一部抜粋です。
このようにしましたが、解決されませんでした。
大文字なのかな?
なるほど、でしたらわかりません……(私も Haskell 初心者なので当てずっぽうで回答してしましました><)
大文字じゃなかったでした。
わかりました、回答くださってありがとうございます。
stack init されてます?
stack init しようとしたら怒られが発生したので stack init --force して package.yamlvector を追加してそして stack runghc DP2.hs -v したらなんかすごいことが始まってしまいました。
あー……やはりエラーは同じメッセージが返って来ますね……。
stack init しましたが、同じエラーが発生します。
1. package.yaml 全体の内容を貼り付けてください。
2. 件のDP2.hsというファイルとpackage.yamlはどのディレクトリーに置いていて、どのディレクトリーから問題のコマンドを実行しましたか?
3. 問題が発生したコマンドは何でしょうか? stack build ?あるいは stack runghc DP2.hs
1.
name:                yaminabe
version:             0.1.0.0
github:              "yourusername/yaminabe"
license:             BSD3
author:              "Your Name"
maintainer:          ""
copyright:           "2021 Your Name"

extra-source-files:
- README.md
- ChangeLog.md

# Metadata used when publishing your package
# synopsis:            Short description of your package
# category:            Web

# To avoid duplicated efforts in documentation and dealing with the
# complications of embedding Haddock markup inside cabal files, it is
# common to point users to the README.md file.
description:         Please see the README on GitHub at <>

dependencies:
- base >= 4.7 && < 5
- array
- bytestring
- containers
- random
- vector
library:
  source-dirs: src

executables:
  yaminabe-exe:
    main:                Example15.hs
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - yaminabe

2.
yaminabe というディレクトリに置いて、このディレクトリから実行しました。
3.
stack runghc DP2.hs です。
多分ソースコードはsrc以下に置いてないとダメだと思う
stack runghc は1ファイルで完結するような、package.yamlを指定するまでもない小さなプログラムで用いるコマンドです。なのでpackage.yamlは参照しません。
このまま runghc で動かすのであれば、 stack runghc --package vector DP2.hs と実行してください。ほかにも必要なパッケージがある場合同じようなエラーが出るでしょう。
うーん?stack ghcってパッケージ読み込まないのかな、読み込むような気がするけど…
まあ何にせよ、そもそもstack ghcするよりstack ghciしてインタラクティブ環境をロードして関数を実行したりreloadした方がdebugには役に立つ気がします
@igrep @
ありがとうございます。
動きました。

1ファイル完結の小さなプログラムで runghc を用いるのですね。
その場合は package.yaml は参照されないとのこと、承知しました。
今のところまだ大きなプログラムを書いていないので、今後も runghc を使うことが多いと思いますが、頭に入れておきます。

お二方、本当にありがとうございました。
助かりました。
1ファイル完結の場合stack script形式を使うのも手だと思います
これだとコマンド方式覚えなくても良いので
https://qiita.com/tanakh/items/1ca4ba9e1f5006a30106

ここに載っているような例でしょうか?
はい、ただ私は実は使ったことないです。
ポータブルな単体ファイルを用意する必要が無かったことと、
ライブラリを試してみるとかの範囲なら、stack installをglobalに実行して書き捨ててEmacsのinf-haskell(ghci)で読み込んで実行して終わりに出来るからです。
:man-bowing: stack runghc がpackage.yamlを読むのでは?という話については今念のためチェックしていますが、うっかりGHC 8.10.7のインストールが始まってしまったため時間がかかっています :man-bowing:
@
なんとなくですが、そちらの方がお手軽そうに見えますね……。>stack installをglobalに実行して書き捨ててEmacsのinf-haskellで読み込んで実行して終わり

なんとか今よりもお手軽な実行方法を身に付けたいと思います。
お答えいただきありがとうございました。
本当に感謝です。

@igrep
検証ありがとうございます。お時間いただいてしまい申し訳ありません。
サクッと stack new してからこんなプロジェクトを作ってみましたがやっぱり package.yaml に書いた safe パッケージは参照していないようです:
package.yaml:
name:                test
version:             0.1.0.0
github:              "githubuser/test"
license:             BSD3
author:              "Author name here"
maintainer:          ""
copyright:           "2021 Author name here"

extra-source-files:
- README.md
- ChangeLog.md

# Metadata used when publishing your package
# synopsis:            Short description of your package
# category:            Web

# To avoid duplicated efforts in documentation and dealing with the
# complications of embedding Haddock markup inside cabal files, it is
# common to point users to the README.md file.
description:         Please see the README on GitHub at <>

dependencies:
- base >= 4.7 && < 5
- safe

library:
  source-dirs: src

executables:
  test-exe:
    main:                Main.hs
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - test

tests:
  test-test:
    main:                Spec.hs
    source-dirs:         test
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - test

src/Lib.hs:
module Lib
    ( main
    ) where

import           Safe

main :: IO ()
main = print $ headMay [True]

ただ、ちょっと紛らわしい挙動をするので補足します。
stack buildstack runghc --package safe src/Lib.hs を実行する*前*に stack runghc src/Lib.hs すると予想通り Safe モジュールがないと言われるのですが、`stack build` や stack runghc --package safe src/Lib.hs を実行した*後*に stack runghc src/Lib.hs すると*エラーが起きません*。どうやら、 stack runghc は現在のpackage dbにインストールされているパッケージを、package.yamlの記載にかかわらず使用しているようです。
それが証拠に、 package.yaml から safe パッケージを*削除しても*、`stack build` や stack runghc --package safe src/Lib.hs を実行した*後*であれば stack runghc src/Lib.hs は成功するからです。
なるほど、なので私は勘違いしたわけですね。
検証と回答ありがとうございます。
検証ありがとうございます。
覚えておきたいと思います。
お二方ありがとうございました。