2013-11-26 113 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