haskell-jp / beginners #20 at 2022-02-05 14:16:55 +0900

VSCodeでプログラムを書いているのですが、import文で `Could not find module Data.Attoparsec.Text` などと出たときの対処はどうすれば良いのでしょか。使用している拡張機能は以下の2つです。
・Haskell 
・Haskell Syntax Highlighting 

ちなみに、.ghcup/bin/ghci でこのプログラムをloadすると
Could not find module 'Data.Attoparsec.Text'
とメッセージが VSCode 側と同じエラーが出るのですが、
普段使っている stack 経由で実行した ghci でこのプログラムをloadすると問題なく動きました。
なので、stack 側だけが上手いことやってくれているのだと思いますが、どこの設定を変更すれば良いのかがわかりません。

{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
import Data.Attoparsec.Text hiding (take)

main :: IO ()
main = do
  print $ parse decimal "1000"

cabal のプロジェクト内ではないってことで合ってますか?
はい。cabal は使っていません。
cabalをそもそも使ってないんだったら stack exec ghci などして使うしかないですね...
ghcup も使わず、 alias ghci stack exec ghci -- 等の設定で、ghciコマンドを実行したときにstackからGHCiを呼ぶように設定した方がいいと思います。
ありがとうございます。3点質問をさせてください。
1. stack ghci ではなく stack exec ghci なのは何か意味があるのでしょうか(私は stack ghci の方を使っていました)。
2. alias ghci stack exec ghci — とする意図は、VSCode 側でソースコードを処理するときに内部で呼んでいる(?) ghci コマンドと、私がいつも stack ghci として実行している ghci コマンドを同じにしたいということであっていますか。
3. そもそもの話なのですが、「cabal を使っていないのであれば」ということは、これは cabal ではなく stack を使っている人がぶつかる問題ということなのでしょうか。
1. 実はその二つは目的が違うコマンドでして、先に後者を説明すると、後者は、現在のプロジェクトのstack.yamlに応じた環境変数を指定した状態でghciを起動するだけ、です。対する前者は、後者の機能に加え、プロジェクトの中で実行した場合、プロジェクトの中にあるモジュールを一通りロードした状態でGHCiを起動します。前者の方が高機能ではあるのですが、ghciコマンドに直接オプションを渡しづらいという問題があるので必要なとき以外は stack exec ghci をおすすめします。
2. いや、単純にghciコマンドだけで(stackがインストールしたパッケージが利用できる状態で)ghciを起動したいならaliasを設定しておくといいですよ、という話です。VS Codeがどうやってどのghciを起動させているのかは知りません。
3. 「stackを使っている人がぶつかる」というより正確にはstackとghcup両方をインストールして両方でGHCをインストールした人がぶつかる、といった方が適切かも知れません。 https://haskell-jp.slack.com/archives/CR2TETE5R/p1643286256145989 の回答で説明したとおり、stackはそれだけでghcupやcabal相当のことを概ねすべてこなしてくれるので、stackかghcup+cabalかのどちらかに絞った方が混乱しにくいかと思います。
(途中で送信してしまいましたが今完成させました)
なるほど…
1. そんな違いがあったのですね。初学者としてもおすすめを教えていただけるのはありがたいです。`stack exec ghci`を使おうと思います。
2. これはその通りですね。
3. ghcupを削除したらVS Codeの方のエラーもなくなったので「stackとghcup両方をインストールして両方でGHCをインストールした人がぶつかる」っぽいですね。stack, ghcup, cabalの関係性も少し理解が進みました。ありがとうございました。