【问题标题】:Can't match expected type with actual type, Haskell无法将预期类型与实际类型匹配,Haskell
【发布时间】:2018-10-11 20:56:24
【问题描述】:

我遇到了这个错误无法匹配预期的类型 Double -> (Double, Double, Double)' with actual type(Double, Double, Double) 我不知道如何解决,这几天我一直在努力解决不同的错误,现在我想我有了,只需要修复它,这是我的代码:

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

这很简单,但我只是从 Haskell 开始,由于对函数式编程不熟悉,我发现我的道路上有很多障碍。谢谢。

【问题讨论】:

    标签: haskell types match


    【解决方案1】:

    去掉括号和逗号:

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

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

    【讨论】:

      【解决方案2】:

      看看函数的头部:

      terna <b>(x, y)</b> = ...

      这是一个二元组的模式,而不是一个有两个参数的函数(注意,严格来说,函数有一个一个参数,这里我们因此构造一个有一个参数的函数,它生成然后接受另一个参数的函数,但 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))

      【讨论】:

        猜你喜欢
        • 2016-07-18
        • 1970-01-01
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多