所以我是haskell的新手,我不太确定如何做某些事情 没有多少在线教程甚至可以解决我遇到的问题,所以我想我最后会问到这里
这是我的代码:(它在lhs文件中)
> data PointVal = PointVal Float Float Float Float
> deriving (Show)
> parabolaCordDistance :: Float -> Float -> Float -> Float -> Float
> parabolaCordDistance x1 x2 y1 y2
> abc = PointVal x1 x2 y1 y2
>
>
所以现在我得到的错误是:
Extension.lhs:17:3:
Couldn't match expected type `t0 -> PointVal'
with actual type `Float'
The equation(s) for `parabolaCordDistance' have five arguments,
but its type `Float -> Float -> Float -> Float -> Float'
has only four
Failed, modules loaded: none.
我基本上尝试创建一个名为PointVal的数据类型,其中4个浮点数充当x和y坐标。 然后我尝试使用ParabolaCordDistance输入这些内容 并使用abc作为数据类型中的变量" PointVal"
如果有人可以帮助删除此错误;或指出我出错的地方以及如何解决它,这太棒了!
答案 0 :(得分:3)
也许您正在寻找这种语法:
> parabolaCordDistance x1 x2 y1 y2 = 3 where
> abc = PointVal x1 x2 y1 y2
这定义了一个变量abc
,parabolaCordDistance
的本地变量,值为PointVal x1 x2 y1 y2
。您当然希望将返回值3
更改为更有意义的计算;这只是为了做一个完整的例子。
答案 1 :(得分:2)
表单a -> b -> c -> d -> e
的类型签名表示具有四个参数的函数(a
,b
,c
,{{1} })不是五 - 最后一项是返回值的类型(d
)。
因此,当您定义此类函数的主体时,您应该只使用正确数量的参数定义它,并且返回值不是参数。
在你的情况下,签名是e
,它“转换”为“一个需要4个浮点数并返回浮点数的函数”。
首先从实现定义中删除第5个Float -> Float -> Float -> Float -> Float
参数
abc
其次我认为parabolaCordDistance x1 x2 y1 y2 = PointVal x1 x2 y1 y2
是您返回的而不是PointVal
,因此您需要调整您的类型签名
Float
你也可以删除类型注释,并在GHCi提示符下询问Haskell认为函数的类型是什么(在删除无关/伪造parabolaCordDistance :: Float -> Float -> Float -> Float -> PointVal
arg后,你并不是真的意思):< / p>
abc
但请注意,*> :t parabolaCordDistance
parabolaCordDistance :: Float -> Float -> Float -> Float -> PointVal
的定义,考虑到其当前的实现,可以简化为
parabolaCordDistance
但我假设您可能希望在稍后阶段为该功能添加更多处理。
答案 2 :(得分:0)
我不确定你要做什么,尤其是abc
。您的代码被解释为
parabolaCordDistance x1 x2 y1 y2 abc = PointVal x1 x2 y1 y2
所以函数parabolaCordDistance
得到五个参数。这与该类型不一致,该类型需要四个Float
个参数。这就是你得到的错误。
答案 3 :(得分:0)
您应该更好地使用更明确的方式来创建2d点
data Point = Point (Float, Float) (Float, Float)
deriving (Show)
导致ghci
*Main> Point (1,1) (2,2)
Point (1.0,1.0) (2.0,2.0)