显示构造函数

时间:2013-08-12 04:39:56

标签: haskell

为什么会抱怨这段代码:

data Point = Point {
              x, y :: Int
            } deriving (Show)

main = print $ Point (15 20)

说:

No instance for (Show (Int -> Point))
      arising from a use of `print'
    Possible fix: add an instance declaration for (Show (Int -> Point))

2 个答案:

答案 0 :(得分:9)

包围错误。包围(15 20)会使编译器将其视为Point的一个参数,并且您错过了第二个参数。如果您删除这些括号以离开Point 15 20它将起作用。

答案 1 :(得分:9)

什么是错误的

data Point = Point {
              x, y :: Int
            } deriving (Show)

如果我们将构造函数Point表示为函数,则可能会更加明显:

Point :: Int -> Int -> Point

如果你知道函数应用程序的语法,那么这就变得非常清楚:

main = print $ Point 15 20

为什么会出现此错误

至于为什么破坏的代码会出现您的特定错误,请考虑如何对其进行类型检查。我们有这样的表达:

Point ( ...something... )

如果Point :: Int -> Int -> Point那么Point something必须是Int -> Point类型(Point应用于任何单个参数的类型)。现在你看到它是如何得出结论你试图在类型为print的东西上调用Int -> Point并因此抱怨缺少的实例 - 它甚至不考虑(15 20)的错误表达。