【问题标题】:Haskell import and exportHaskell 导入和导出
【发布时间】:2011-06-07 04:53:48
【问题描述】:

我从零到 Haskell,出现以下无法摆脱的错误。基本上 t2 正在尝试使用在另一个模块t1 中定义的函数add1。所以

t1.hs-----
module t1 (add1) where
add1 :: Int -> Int
add1 x = x + 1

t2.hs-----
module t2 where
import t1
   add1 2

错误总是说parse error on inputt2'`

有什么问题?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    模块名称应该是大写的,你的t2.hs文件也有一些问题,我已经修改了它,所以你应该可以用runghc t2.hs运行它并看到一些输出:

    t1.hs

    module T1 (add1) where
    add1 :: Int -> Int
    add1 x = x + 1
    

    t2.hs

    module T2 where
    import T1
    main = do
      let x = add1 2
      putStrLn (show x)
    

    【讨论】:

    • 是不是因为 Haskell 中的惰性求值,我可以直接使用addl 2 在 t2 中获取值 3?我以为它就像在 Racket 中一样......
    • @freezdom:根据语言定义,您想要在运行时完成的任何事情都必须在主函数中调用。或者,您可以使用 ghci 来运行您的代码。
    • @freezdom:这个值 3 会去哪里?您可以声明一个新变量:someGlobalVal = addl 2,或者您可以将其设置为像 main 这样的函数的本地变量,如图所示。仅在某个顶级拥有 addl 2 不仅不是 Haskell,而且我不知道你想要它做什么。
    【解决方案2】:

    它必须是大写的。将t1设为T1,将t2设为T2,就可以了

    t1.hs-----
    module T1 (add1) where
    add1 :: Int -> Int
    add1 x = x + 1
    
    t2.hs-----
    module T2 where
    import T1
       add1 2
    

    【讨论】:

    • 请注意,add1 2 无效;你需要像main = print $ add1 2这样的东西。
    • 1.为什么我不能使用print $ add1 2 而需要使用main = print $ add1 2 并调用main 来获取值? 2.不能在定义main的同一个文件中直接调用main?例如我不能在 T2 文件中调用 main.. 这是为什么?
    • @freezdom:所有表达式都必须在函数中,这与 C 或 Java 非常相似,但与大多数脚本语言(例如:Perl、Python)不同。见this related question。另外,main 函数必须在 Main 模块中,所以只需从 t2.hs 中删除 module T2 where 或将其更改为 module Main where
    • 我认为它就像在 Racket 中一样。
    【解决方案3】:

    我猜你想加载模块 t2,它应该显示“3”?

    这不起作用,因为您必须加载模块然后执行命令。您可以加载模块 t1 并在解释器 shell 中执行“add1 2”,也可以在 t2 中定义一个调用“add1 2”的新函数:

    t2.hs-----
    module t2 where
    import t1 
       add1to2 = add1 2
    

    现在您可以调用函数 add1to2。

    托比亚斯

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多