haskell关于参数的数据类型错误

时间:2015-10-08 21:26:56

标签: haskell

所以我是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"

如果有人可以帮助删除此错误;或指出我出错的地方以及如何解决它,这太棒了!

4 个答案:

答案 0 :(得分:3)

也许您正在寻找这种语法:

> parabolaCordDistance x1 x2 y1 y2 = 3 where
>       abc = PointVal x1 x2 y1 y2

这定义了一个变量abcparabolaCordDistance的本地变量,值为PointVal x1 x2 y1 y2。您当然希望将返回值3更改为更有意义的计算;这只是为了做一个完整的例子。

答案 1 :(得分:2)

编辑:我想我误解了你的具体问题;丹尼尔虽然钉了它!我保留了我的答案,因为它可能仍然有用,并且肯定是适度相关的。

表单a -> b -> c -> d -> e的类型签名表示具有四个参数的函数(abc,{{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)