为什么会抱怨这段代码:
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))
答案 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)
的错误表达。