2013-11-26 143 views
-3

我正在學習如何在Haskell中創建代數類型。Haskell錯誤代數類型

我剛開始,希望兩個參數可以用數學方法求解。

這裏是我的代碼:

data calculate = firstargument Int | sndargument Int 
doit :: calculate-> Int 
doit (calculate firstargument sndargument) = firstargument + sndargument 

我得到一個錯誤 「不是一個數據構造firsrargument」

有什麼不對?


EDITED NEW CODE

這是我改變的代碼:

data Calculate = Firstargument Int | Sndargument Int 

f :: Calculate 
f = Firstargument 1 

s:: Calculate 
s = Sndargument 2 

addCalc :: Calculate -> Calculate -> Int 
addCalc (Firstargument x) (Firstargument y) = x+y 
-- not the complete pattern matching , but should be enough for testing purposes. 
+0

可能我建議您閱讀「瞭解你哈斯克爾「? –

回答

2

類型的構造函數和數據構造必須開始在Haskell一個大寫字母。

4

首先,數據類型和構造必須以大寫字母

data Calculate = FirstArgument Int | SndArgument Int 

現在,您可以構建Calculate類型的值作爲

f :: Calculate 
f = FirstArgument 1 

s :: Calculate 
s = SndArgument 2 

其次,你不能把它們相加直接將它作爲類型類型的一個實例,但現在只需使用模式匹配(除非需要其他算術運算符)就更容易了:

addCalc :: Calculate -> Calculate -> Int 
addCalc (FirstArgument x) (FirstArgument y) = x + y 
addCalc (FirstArgument x) (SndArgument y) = x + y 
addCalc (SndArgument x) (FirstArgument y) = x + y 
addCalc (SndArgument x) (SndArgument y) = x + y 

然而,從你的例子看,你似乎誤解了如何使用代數數據類型。我建議他們刷牙閱讀Learn You a HaskellReal World Haskell


編輯

要ghci中使用它,你可以做

> addCalc (FirstArgument 1) (FirstArgument 2) 
3 
> let x = FirstArgument 20 
> :type x 
Calculate 
> let y = SecondArgument 40 
> :type y 
Calculate 
> addCalc x y 
60 
+0

您好, 感謝您的回覆 這裏是我更改的代碼: entdata Calculate = Firstargument Int | Sndargument詮釋 ˚F::計算 F = Firstargument 1點 的s ::計算 S = Sndargument 2 addCalc ::計算 - >計算 - >內部 addCalc(Firstargument X)(Firstargument Y)= X + Y - 不是完整的模式匹配,但應足以用於測試目的。 它拒絕編譯當我鍵入「addCalc(5)(3)」 它說「沒有Num的實例」 所以,剛纔你剛纔提到。 我該如何解決這個問題? – Blnpwr

+0

你必須在構造函數中包裝'5'和'3',使其具有'Calculate'類型。值'5'本身具有'Num a => a'類型,它不是同一類型。 – bheklilr

+0

另外,如果你有新的代碼,請編輯你的問題,在評論中閱讀大塊代碼要困難得多 – bheklilr