1

为什么它抱怨这段代码:

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))
4

2 回答 2

9

你的括号是错误的。括号(15 20)使编译器将其视为 的一个参数Point,而您缺少第二个参数。如果您删除这些括号以离开Point 15 20,它将起作用。

于 2013-08-12T04:54:02.443 回答
9

怎么了

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

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

Point :: Int -> Int -> Point

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

main = print $ Point 15 20

为什么会出现此错误

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

Point ( ...something... )

并且如果Point :: Int -> Int -> PointthenPoint something必须是类型Int -> PointPoint应用于任何单个参数都已表示类型)。现在你看到它是如何得出结论的,你试图调用print一些输入的东西Int -> Point,因此抱怨缺少实例——它甚至不考虑(15 20).

于 2013-08-12T05:00:01.190 回答