在我开始列出您的代码有什么问题以及如何修复它之前,我建议您先阅读一些教程或 haskell 介绍性文本,例如Learn You a Haskell for Great Good,因为您的代码表明您没有掌握一些基本语法。
首先,你得到的错误来自
():g++g1++g2
在haskell中,top level
(0缩进)中的任何内容都必须是某种声明(导入,类型签名)或函数实现方式的一部分。
所以你有一个实现(虽然错了,但稍后会更多),但问自己,“我怎么知道这条线与 ver 相关?” 好吧,在 haskell 中,您有特殊的关键字,例如let
orwhere
来表达这一点。由于您没有这些,因此该代码行丢失了,与实现无关,并且它不能存在于顶层 - 从而导致错误。我将展示如何尽快解决这个问题。
其次,这条线没有达到你的预期。()
表示一个空元组,:
是一个列表构造函数并且++
是列表追加。为了创建一个浮动元组,这两个都没有意义^ 3
你需要一些东西:
(,,) g g1 g2
--or
(g,g1,g2)
第三,您的函数实现与类型指定的内容无关。也就是说,您有 3 个版本来ver
代替ver
带有 3 个参数的版本。再问问自己“我怎么知道 xyz 来自哪里”?
如果你想定义一个有 3 个参数的函数,函数应该是这样的:
ver x y z = -- Insert the calculations you want.
看?xyz 是函数的输入变量。你放在左边的=
东西是输入,右边的东西是输出。
好的,但是 g g1 g2 怎么样?我怎么知道我想计算这 3 个值,给它们命名,然后使用它们?
是时候使用where
我之前告诉过你的那个条款了。看看你的函数应该是什么样子:
ver :: (Float,Float)->(Float,Float)->(Float,Float)->(Float,Float,Float)
ver x y z = (g,g1,g2)
where g=sqrt((((fst x -fst y)^2)+((snd x -snd y)^2)))
g1=sqrt((((fst x -fst z)^2)+((snd x -snd z)^2)))
g2=sqrt((((fst y -fst z)^2)+((snd y -snd z)^2)))
并且一定要注意缩进,因为如果你把 where 放在与 ver 相同的级别,你并没有表达 where 属于哪个函数。