我今天才刚刚开始学习 Haskell,一直在视频讲座、编程练习和 http://learnyouahaskell.com/ 之间交替进行电子书。我在学习中还没有遇到的一件事是导入自定义模块的最佳实践方法,我想通常如何 Haskell 导入模块。
上下文
在过去的几个小时里,我一直在使用命令行 stack new [ProjectName]
创建项目并修改 src 中的
子目录(见图)。这就是我测试脚本功能的方式。直到我发现在 Lib.hs
文件app
子目录中有一个 Main.hs
文件调用 Lib.hs
模块。因此,我尝试在 src
子目录中创建自己的 .hs
文件,而不是默认的 Lib.hs
。
我的主,修改后的样子
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
。
有人可以告诉我我的错误是否在于这些事情之一吗?
SpaceAge.hs
需要和Main.hs
在同一个目录吗?如果是这样,为什么这个引用问题不影响默认的Lib.hs
?SpaceAge.hs
文件包含错误?- 需要修改
package.yaml
吗? Main.main
类型错误?
如果需要问题的更多详细信息 - 我将相应地编辑问题。谢谢。
我读过以下类似的问题:
- Unable to import modules in haskell (不一样的错误信息)
- 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/