Haskell错误代数类型

时间:2013-11-26 19:40:06

标签: haskell

我正在学习如何在Haskell中创建代数类型。

我刚刚开始,并希望这两个参数以数学方式解决。

这是我的代码:

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

我收到错误“不是数据构造函数firsrargument”

有什么问题?


编辑新代码

以下是我更改的代码:

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.

2 个答案:

答案 0 :(得分:4)

首先,数据类型和构造函数必须以大写字母

开头
data Calculate = FirstArgument Int | SndArgument Int

现在,您可以将Calculate类型的值构造为

f :: Calculate
f = FirstArgument 1

s :: Calculate
s = SndArgument 2

其次,你不能直接将它们加在一起而不将其作为Num类型类的实例,但现在更容易使用模式匹配(除非你需要其他算术运算符):< / p>

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

答案 1 :(得分:2)

类型构造函数和数据构造函数必须以Haskell中的大写字母开头。