【发布时间】:2019-10-11 23:12:18
【问题描述】:
我是 Haskell 和函数式编程的新手。我目前正在学习自定义数据类型,并且有以下内容:
data Point = Pt Double Double deriving (Show, Eq)
getValue :: Point -> Double
getValue (Pt a _) = a
我试图从自定义数据类型中仅返回一个双精度值,但遇到了问题。每当我尝试提取其中一个点值时,我的控制台都会出现以下错误:“无法匹配预期的类型Integer -> Integer -> t”。关于我做错了什么有什么想法吗?
(从 OP 的 cmets 编辑:)我在 GHCi 中输入了以下内容
test Pt 1.0 1.0
这是完整的错误信息:
• Couldn't match expected type ‘Integer -> Integer -> t’
with actual type ‘Double’
• The function ‘test’ is applied to three arguments,
but its type ‘Point -> Double’ has only one
In the expression:
test Pt 1 1
In an equation for ‘it’:
it = test Pt 1 1
• Relevant bindings include
it :: t (bound at <interactive>:497:1)
test 是我将getValue 重命名为。
【问题讨论】:
-
当我将代码粘贴到 GHCi 中时,它对我来说工作正常。奇怪的是,当您的代码中的所有基本类型都是
Doubles 时,您报告的错误消息却提到了Integers。请提供您正在使用的确切代码(我怀疑还有更多,真正的错误在其他地方)。 -
感谢您抽出宝贵时间提供帮助。不幸的是,我在问题中包含的是我的 .hs 文件中唯一的代码。它可以编译,但是当我尝试运行测试函数时,我得到了前面所述的错误。
-
感谢您的澄清 - 那么问题是,当您“运行测试功能”时您在做什么?你的意思是在 GHCi 中输入一些表达式吗?如果有,准确的表达方式是什么? (事实上你只包含了错误信息的一部分——它还应该告诉你实际的类型,以及不匹配发生在哪个表达式中——这使得你很难猜测你可能做了什么。)
-
是的,我在 GHCi "test Pt 1.0 1.0" 中输入了以下内容。抱歉,我不想包含整个消息,因为不包含不必要的字符。这是完整的错误消息: • 无法将预期类型 'Integer -> Integer -> t' 与实际类型 'Double' 匹配 • 函数 'test' 应用于三个参数,但其类型为 'Point -> Double'只有一个 在表达式中:test Pt 1 1 在“it”的等式中:it = test Pt 1 1 • 相关绑定包括 it :: t(绑定在
:497:1) -
好吧,你还没有告诉我
test是什么,但这足以找出问题所在——你显然想做test (Pt 1.0 1.0)。没有括号的test Pt 1.0 1.0被解释为将test函数应用于Pt、1.0和1.03 个参数,这没有任何意义,这也是GHC 抱怨的原因。
标签: haskell syntax function-call custom-data-type