我正在学习如何在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.
答案 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 Haskell和Real 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中的大写字母开头。