2012-07-21 63 views
3

我是一個絕對的初學者。使用emacs瀏覽LYAH。模糊發生`只是'

我現在的建立:

  • 的Ubuntu 12.04 LTS(使用體驗 - 初學者)
  • GNU Emacs的23(使用體驗 - 初學者)
    • 能夠在Haskell主要模式下工作

發現難以遵循指令(帶來haskell庫)在Point 2 described here.

還需要指導啓用Scion IDE

問題:

開發文件代碼

data Maybe a = Nothing | Just a 

運行代碼時,我得到以下錯誤:

請忽略錯字的錯誤,原帖:

*Main> just "Haha" 

互動>:339:1:不在範圍內:`只是'

這是真正的錯誤(吉洪Jelvis'評論後加入):

*Main> Just "Haha" 
interactive>:341:1: 
    Ambiguous occurrence `Just' 
    It could refer to either `Main.Just',  
          defined at /home/optimight/baby.hs:89:26 
          or `Prelude.Just', 
          imported from `Prelude' at /home/optimight/baby.hs:1:1 
          (and originally defined in `Data.Maybe') 
+0

**嬰兒步驟** - 哈哈哈,我第一次看到一個誠實的要求喂勺子。涼。 :) – Nishant 2012-07-21 03:32:36

+0

呃,'剛剛'必須以大寫字母開頭。所以你應該寫'Just'哈哈''。這是一個錯誤的錯誤或你實際輸入GHCi? – 2012-07-21 04:03:09

回答

10

你的錯誤只是告訴你,有2個Just可能的版本和GHCI不知道哪一個挑。

每個Haskell程序都隱含地導入一大堆函數和數據類型。這些形成了「序幕」。其中一種是Maybe。這意味着每個程序都可以訪問類似於您定義的類型的名稱。

您可以通過兩種方式克服這一點。最好的辦法是隻選擇不同的名稱:

data MyMaybe a = MyJust a | MyNothing 

(我相信你能拿出一個比這更好的,雖然名字:P)

的另一個選項是導入的前奏明確地說,隱藏Maybe

import Prelude hiding (Maybe (..)) 

這條線在你的程序的頂部只是告訴哈斯克爾進口一切它通常進口除了Maybe和它的所有構造或(JustNothing)。

現在您將遇到更多問題:GHCi不知道如何將您的Maybe類型的值呈現爲字符串以顯示在提示符上。你會得到這樣的錯誤:

<interactive>:1:1: 
No instance for (Show (Maybe [Char])) 
    arising from a use of `print' 
Possible fix: add an instance declaration for (Show (Maybe [Char])) 
In a stmt of an interactive GHCi command: print it 

你需要做的是告訴編譯器一個Maybe值的外觀爲一個字符串。令人高興的是,這非常簡單。實際上,它是所以即使電腦也可以做到!如果你定義類型:

data Maybe a = Just a | Nothing deriving (Show) 

那麼編譯器會寫show功能(這基本上是toString從其他語言)爲您服務。現在您的原始聲明(Just "Haha")應該正常工作。

另外:啓用Scion完全是一個完全不同的問題。我認爲在你學到更多的Haskell之前,它並不值得爲之煩惱,並且實際上正在開展某種大型項目。目前,標準的Haskell模式應該足夠了。

+0

先生,我謙卑的要求添加一個選項:我的錯誤是,我宣佈'數據可能'已經宣佈,並在前奏。人們可以選擇 - 不是直接聲明,而是直接測試'Just'哈哈''。 – Optimight 2012-07-21 06:05:25

+0

當我運行'數據MyMaybe a = MyJust a | MyNothin'它編譯得很好。當我然後運行'MyJust'空白''我得到一個錯誤「沒有實例(顯示...」我可以理解爲什麼我會得到這個錯誤,但是學習你一個Haskell顯示了一種不同於錯誤的行爲,你能解釋一下爲什麼嗎? – Addem 2017-02-24 05:32:42

+0

我不知道LYAH對這個問題所表現出來的問題,因爲'MyMaybe'沒有'Show'實例:你可以手動實現一個或添加一個'deriving Show'子句到數據定義。 – 2017-02-25 10:23:51