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

时间:2018-05-26 19:15:09

标签: haskell emacs haskell-mode

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

我通过CIS 194(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.)

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

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

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模式,但还没有找到任何可用的解决方案。

感谢您阅读此问题,我们将非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

Krantz's answer的帮助下以及更多阅读,通过使用堆栈创建一个新项目来解决问题,因此intero知道我的源文件的位置。 因此,这个问题是由于intero不知道在emacs中的intero-global-mode中查找本地模块的位置。 在这里,我将在此处写下我自己的答案,以便更多地展开Krantz的答案,并记录作为Haskell初学者解决此问题的过程:

为了让intero能够导入本地模块,我们应该避免使用stack new homework2而是创建一个本地项目(后见之明对我来说更有意义)。

因此,对于本作业2,不是按照问题中的描述将文件移动到家庭作业文件夹,而是homework2\src,并将源文件移动到LogAnalysis.hs。然后,当使用emacs加载*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. 获取:

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_challenge_mode_tutorial);

    final LinearLayout layout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID);
    ViewTreeObserver vto = layout.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener (new OnGlobalLayoutListener() { 
        @Override 
        public void onGlobalLayout() {
            // Remove listener to prevent repeat calls.
            layout.getViewTreeObserver().removeOnGlobalLayoutListener(this); 

            // Start countdown here.

        } 
    });
}

问题解决了。