无法将预期类型与实际类型Haskell匹配

时间:2018-10-11 11:06:44

标签: haskell types match

我遇到此错误无法匹配预期的类型Double -> (Double, Double, Double)' with actual type(双精度,双精度,双精度) 我不知道该如何解决,我已经为这个问题苦苦挣扎了好几天,并且有不同的错误,现在我想我已经掌握了,只需要修复它,这就是我的代码:

terna :: Double -> Double -> (Double, Double, Double) terna (x, y) = (x, y, (sqrt ((x*x)+ (y*y))))

这很简单,但是我刚开始使用Haskell,由于对函数式编程还很陌生,所以我发现了很多难题。谢谢。

2 个答案:

答案 0 :(得分:4)

只需除去括号和逗号:

terna x y = (x, y, (sqrt ((x*x)+ (y*y))))

Haskell中的函数应用程序是使用空格而不是大多数其他语言中的括号和逗号来完成的。特别是,编译器将(x, y)解释为一对(具有2个值的元组),因此会看到类型错误。

答案 1 :(得分:4)

看一下函数的开头:

terna (x, y) = ...

这是2元组的模式,而不是具有两个参数的函数的模式(请注意,严格来说,函数具有一个参数,因此在这里我们构造了一个具有一个参数的函数,该函数生成然后使用其他参数的函数,但是Haskell为此提供了更方便的语法。

因此,您的函数的签名为:

terna :: (Double, Double) -> (Double, Double, Double)
terna (x, y) = (x, y, sqrt (x*x + y*y))

但是通常在Haskell中,函数是“ curried ”,因此将其编写为这样更有意义:

terna :: Double -> Double -> (Double, Double, Double)
terna x y = (x, y, sqrt (x*x + y*y))