Emacs haskell intero 模式,导入找不到模块

Emacs haskell intero mode, import could not find module

编辑:此错误仅在使用 emacs haskell 模式和 intero 模式(C-c C-l 加载到 ghci)时发生。它在命令行中使用 stack ghc Log.hs LogAnalysis.hs.

我正在通过 CIS 194(Spring 2013)学习 Haskell,并且在做 homework 2 时 运行 遇到了这个问题。作业文件夹很简单:

homework2
|-- LogAnalysis.hs
|-- Log.hs
|-- error.log
|-- sample.log

一些数据类型在Log.hs中定义,需要导入到LogAnalysis.hs中,这是我需要处理的文件。 LogAnalysis.hs中的前几行是这样的:

{-# OPTIONS_GHC -Wall #-}
module LogAnalysis where

import Log

-- Exercise 1: parse an individual message
...

但是,我在使用带有 intero 的 haskell 模式的 emacs 中收到这样的错误消息:

error:
    Could not find module 'Log'
    Use -v to see a list of the files searched for.

(Hit 'C-c C-r' in the Haskell buffer to apply suggestions.)

在 emacs 中使用 'C-c C-l' 加载到 ghci 时出现相同的消息。

但是在命令行中使用 stack ghci 加载 LogAnalysis.hs 时不会出现此错误,而是消息:

Prelude> :l LogAnalysis.hs
[1 of 2] Compiling Log              ( Log.hs, interpreted )
[2 of 2] Compiling LogAnalysis      ( LogAnalysis.hs, interpreted )
Ok, two modules loaded.
*LogAnalysis>

所以我猜测这个错误与我的 emacs 设置的 haskell 模式和 intero 模式有关,但还没有找到任何可用的解决方案。

感谢阅读此问题,我们将不胜感激!

intero 似乎需要 package.yamlstack.yaml 才能找到您的源文件。您可以 运行 stack initstack new 自动生成这些项目文件。
我多次遇到这个问题。以上方法解决了我在 Windows 和 Fedora 上的问题,希望对您有所帮助。

和更多阅读的帮助下,通过使用堆栈创建一个新项目解决了问题,因此 intero 知道我的源文件的位置。 因此,这个问题是由于在 emacs 中 intero-global-mode 时,intero 不知道在哪里寻找本地模块。 这里我把自己的答案写在这里,把Krantz的答案再扩展一点,记录一下作为初学者到Haskell:

解决这个问题的过程

为了让 intero 能够导入本地模块,我们应该避免使用 intero-global-mode 而是创建一个本地项目(事后看来这对我来说更有意义)。

所以对于这个家庭作业 2,我不会像问题中描述的那样将文件移动到家庭作业文件夹,而是 stack new homework2,并将源文件移动到 homework2\src。然后当使用 emacs 加载 LogAnalysis.hs 时,我得到的不是之前的消息 *intero:global-project::repl*:

Loaded GHCi configuration from /Users/[username]/.stack/global-project/.stack-work/intero/intero-[script]

和加载时的错误消息 LogAnalysis.hs,我现在能够得到:

Loaded GHCi configuration from /path/to/homework2/.stack-work/intero/intero-[script]

*intero:homework2:homework2:repl*。使用 C-c C-l 加载 LogAnalysis.hs 现在得到:

[2 of 2] Compiling LogAnalysis      ( /path/to/homework2/src/LogAnalysis.hs, interpreted ) [flags changed]
Ok, two modules loaded.

所以问题解决了。