haskell - 在 Haskell 中导入模块(初学者)

标签 haskell module

我今天才刚刚开始学习 Haskell,一直在视频讲座、编程练习和 http://learnyouahaskell.com/ 之间交替进行电子书。我在学习中还没有遇到的一件事是导入自定义模块的最佳实践方法,我想通常如何 Haskell 导入模块。

上下文

在过去的几个小时里,我一直在使用命令行 stack new [ProjectName] 创建项目并修改 src 中的 Lib.hs 文件 子目录(见图)。这就是我测试脚本功能的方式。直到我发现在 app 子目录中有一个 Main.hs 文件调用 Lib.hs 模块。因此,我尝试在 src 子目录中创建自己的 .hs 文件,而不是默认的 Lib.hs

Project Directory Structure

我的主,修改后的样子

module Main (main) where

import Lib
import SpaceAge -- my attempt to import custom module

main :: IO ()
main = ageOn  -- Previously someFunc from Lib.hs

位于 src 子目录中的自定义模块 SpaceAge.hs 如下所示。

-- This script is from one of the programming exercises
import SpaceAge ( Planet(..), ageOn ) where

data Planet = Mercury
    | Venus
    | Earth
    | Mars
    | Jupiter
    | Saturn
    | Uranus
    | Neptune

ageOn :: Planet -> Float -> Float
ageOn planet seconds = seconds / earthYear * planetMultiplier
    where
        planetMultiplier = case planet of
            Mercury -> 0.2408467
            Venus ->   0.61519726
            Earth ->   1
            Mars ->    1.8808158
            Jupiter -> 11.862615
            Saturn ->  29.447498
            Uranus ->  84.016846
            Neptune -> 164.79132
        earthYear = 31557600

在 VS Code 中运行此项目会产生错误:parse error on input 'where' on line 1 after the module is interpreted。我已经辛苦工作了大约一个小时,现在故障排除和谷歌搜索都无济于事。我在电子书中发现自定义模块应该与 Main.hs 文件位于同一目录中。我试过了,但收到错误 找不到文件:.\Ex2\src\SpaceAge.hs

有人可以告诉我我的错误是否在于这些事情之一吗?

  1. SpaceAge.hs 需要和 Main.hs 在同一个目录吗?如果是这样,为什么这个引用问题不影响默认的 Lib.hs
  2. SpaceAge.hs 文件包含错误?
  3. 需要修改package.yaml吗?
  4. Main.main 类型错误?

如果需要问题的更多详细信息 - 我将相应地编辑问题。谢谢。


我读过以下类似的问题:

  1. Unable to import modules in haskell (不一样的错误信息)
  2. Importing Crypto Modules in Haskell (似乎与我的问题无关)

最佳答案

这是一个简单的错字。你写的地方

import SpaceAge ( Planet(..), ageOn ) where

你应该写

module SpaceAge ( Planet(..), ageOn ) where

import 语句用于从不同模块导入名称;您需要 module 语句来声明模块名称(和导出列表)。

关于haskell - 在 Haskell 中导入模块(初学者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74934997/

相关文章:

android - ImageFactory.imageAsResized 返回 null

c - 绕过 softlockup_threshold

haskell - 弗雷格如何概括数字文字?

haskell - 如何允许数组单个元素解析失败,同时保留其他元素?

haskell - 有相当于步进器的网线吗?

go - 将 Go 依赖模块升级到新的主要版本

android - 如何使用钛模块运行原生 android Activity?

java - 在 Maven 模块化项目中查找未使用的代码

haskell - Haskell printf 是如何工作的?

algorithm - Haskell:两个单词之间的共享字母