1

我很喜欢这种新语言,但有时它很难排除故障。

这是我的教授想要的,他希望我接受用户的数字并计算运行平均值。

现在到目前为止,这就是我所拥有的,除了我的基本编为某些类型错误给出错误。

我是 Comp Sci 的学生,这是一个我正在尝试自己完成的作业问题。

   module Main (listM, main) where

   import System.IO  
   import Data.List

   listM = [1, 2, 3]


    main = do

     average listM = realToFrac (sum listM) / genericLength listM   

     putStrLn (show(listM))

现在我有这个错误,让我发疯...... :S Q1.hs:12:18: parse error on input `='

4

2 回答 2

3

很高兴听到您在学习 Haskell 时玩得很开心!

就你的任务而言:你根本没有做坏事。我会说:你快到了。

正如 Dwilson 在他出色的回答中解释的那样,编译器拒绝您的程序的原因是您的定义listM被放在了导入之前。在 Haskell 模块中,您总是从模块头(有时前面有一些 pragma)和导入列表开始,然后是函数的定义:

module Main (main) where

import System.IO
import Data.List

...

现在,您提到编译器(或者解释器)由于“类型错误”而拒绝您的程序。但是你得到的实际上是一个“解析错误”。理解两者之间的区别不会有什么坏处:

  • 当编译器处理你的程序时,它首先检查你的程序在语法上是否正确。如果不是,它会给你一个解析错误。

  • 然后,它检查您是否以一致的方式使用您的函数,即检查类型是否正确。如果不是,您将面临类型错误。

通常,第一类错误很容易处理:编译器几乎总是将您指向程序中您犯了错误或拼写错误的位置(在您的情况下:第一个 import 语句)。第二类错误有时更难处理——但成为一名优秀的 Haskell 程序员需要熟悉类型系统并真正理解那里发生的事情(而不是仅仅尝试一些事情直到它或多或少地工作......)不过不用担心:这并不像您想象的那么难。

看看你的代码,你定义的让我印象深刻

average xs = realToFrac (sum listM) / genericLength listM

也就是说,您定义average为一个带有参数的函数xs但您没有xs在定义的右侧使用。xs应该是您计算平均值的列表吗?在您的代码中,您的函数始终计算 fix list 的平均值listM,无论您提供什么列表作为average. 除此之外,您的功能还可以。

现在您唯一需要做的就是如何提示用户输入以及如何根据该输入构建一个数字列表。

祝好运并玩得开心点!;)

于 2012-07-12T09:25:46.267 回答
2

就您的输入错误而言,这是因为import System.IOimport Data.List. 在 Haskell 中,缩进很重要,尽管您可以根据需要使用花括号和分号。任何缩进比前一行更远的行都算作该行的延续,因此 ghc 将您的文件解释为listM = [1, 2, 3] import System.IO.

现在,如果这是您唯一需要帮助的事情,那么请尽情享受 Haskell!但是,如果您需要有关结构的帮助,您应该澄清您在寻找什么。您对教授想要什么的描述与您期望发生的事情不匹配。具体来说,教授说您应该从用户那里获取数字,这通常意味着您将在命令行中提示它们,但是您说您希望程序对listM未从用户输入的数字求和。哪一个?

编辑
更新以反映当前状态parse error on '='

GHC 的错误起初可能令人生畏,但我发现当你习惯它们时,它们实际上比其他语言更有帮助。别担心你会到达那里!现在这个错误告诉你的是,GHC 不知道当它= 上线时该做什么average listM = realToFrac (sum listM) / genericLength listM。这是因为它将其视为main = do行的延续,并且在一个do块中,所有绑定都=必须使用let语句完成,如下所示let average listM = realToFrac (sum listM) / genericLength listM:现在这可能不是您想要的,因为那样您的函数average将仅在 do 块中可用!您应该做的是average在块之外定义do,然后在do块内的某个位置调用它。

几个指针:

  • 缩进非常重要。Haskell 通过缩进确定范围、行尾等。
  • ParseErrors 通常意味着您的代码在语法上存在问题。遇到缩进时你应该做的第一件事是检查缩进,然后检查是否缺少括号、括号等。
  • 在 do 块中:
    • let=用于绑定一元的东西,例如let x = length "foobar"
    • <-运算符用于绑定单子的东西,例如x <- getChar
于 2012-07-12T02:30:30.030 回答