2012-07-12 54 views
1

我很享受這種新語言,除了有時難以排除故障。haskel在String中遇到麻煩 - >在列表中加倍

這是我的教授想要的,他希望我接受來自用戶的數字並計算運行平均值。

到目前爲止,這是我所擁有的除了我的基本前衛給出了一些類型錯誤的錯誤。

我是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:輸入'=」

+1

導入必須在*定義之前完成*。同時檢查你的身份,這是相關的。 – Landei 2012-07-12 06:51:07

+0

我修改了縮進回到原來的樣子,因爲它與錯誤有關(並且一旦縮進被「糾正」,幾個答案就沒有意義了) – 2012-07-12 12:23:27

回答

3

很好聽,你有樂趣學習Haskell!

就你的任務而言:你一點都不壞。我會說:你快到了。

正如Dwilson在他的出色答案中解釋的那樣,編譯器拒絕你的程序的原因是你的定義listM被放在導入之前。在Haskell的模塊,您總是以模塊頭(有時被一些編譯指示之前)和進口的清單,然後你的函數的定義開始:

module Main (main) where 

import System.IO 
import Data.List 

... 

現在,你提到的編譯器(或者可能解釋器)由於「類型錯誤」而拒絕您的程序。但是你得到的實際上是一個「解析錯誤」。它不會傷害理解兩者的區別:

  • 當編譯器處理程序首先檢查你的 程序是否語法正確。如果不是,它會在你身上解析 錯誤。

  • 然後,它會檢查您是否在一致的情況下使用您的函數,即 ,即它會檢查類型是否正確。如果他們不是,你 將面臨類型錯誤。

一般而言,第一類錯誤是容易處理:編譯器幾乎總是指向你在你的程序中的點是你犯了一個錯誤或拼寫錯誤(在你的情況:第一import語句)。第二類錯誤有時更難處理 - 但成爲一名好的Haskell程序員需要熟悉類型系統,並且真正理解那裏發生的事情(而不是僅僅嘗試一些事情,直到它或多或少地工作......)不過,不用擔心:這不是你想象的那麼難。

尋找它的代碼,這讓我感到你定義

average xs = realToFrac (sum listM)/genericLength listM 

也就是說,您定義average是一個功能一個需要參數xs,但你不使用xs在您的定義的右側。 xs應該是你計算平均值的列表嗎?在您的代碼中,您的函數始終會計算修正列表listM的平均值,而不管您提供的參數爲average的參數。除此之外,你的功能還可以。

現在您唯一需要做的就是關於如何提示用戶輸入以及如何從輸入中創建數字列表。

祝你好運 - 玩得開心! ;)

+0

嗨,@dbhelix,我要實施一些更改,並希望以積極的結果回覆給您;)haskell是好的,但我真的想提高速度......這很有趣它的工作方式:) – Shawn 2012-07-12 16:43:45

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塊中可用!你應該做的是在do塊之外定義average,然後在do塊內的某個點調用它。

一對夫婦指針:

  • 縮進非常重要。 Haskell通過縮進確定範圍,行結束等。
  • ParseError通常表示語法上與代碼存在錯誤。當你遇到一個你應該做的第一件事是檢查是否有壓痕,然後檢查缺少括號,括號等
  • 在做塊:
    • let=用於綁定的東西都是不一元,例如let x = length "foobar"
    • <-運算符用於綁定一元的事物,例如, x <- getChar
+0

看到它,如果我可以創建一個數字列表,然後打印出平均值到屏幕上,我應該很容易能夠在稍後提示用戶輸入數字。然而,我試過了,現在導入stmts不縮進是在同一級別「我會編輯上面的代碼,以顯示我在我的屏幕上」,但現在我有這個新發現的錯誤 Q1.hs:12:18 :解析錯誤輸入'=' – Shawn 2012-07-12 16:50:06