Haskell 为构造函数显示

Haskell 为构造函数显示,haskell,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

为什么它会抱怨此代码:

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

你的括号错了。将
(15 20)
括起来会使编译器将其视为指向
点的一个参数,而缺少第二个参数。如果您删除这些括号以保留
第15点20
它将起作用

你的括号错了。将
(15 20)
括起来会使编译器将其视为指向
点的一个参数,而缺少第二个参数。如果您删除这些括号以保留
第15点20
它将起作用

怎么了

data Point = Point {
              x, y :: Int
            } deriving (Show)
如果我们将构造函数
表示为一个函数,它可能会变得更加明显:

Point :: Int -> Int -> Point
如果您知道函数应用程序的语法,那么这一点就非常清楚了:

main = print $ Point 15 20
为什么会出现此错误

至于为什么损坏的代码会得到特定的错误,请考虑这是如何检查类型的。我们有这样的表达:

Point ( ...something... )

如果
Point::Int->Int->Point
,那么
Point something
必须是
Int->Point
类型(应用于任何单个参数的
Point
都是上述类型)。现在你可以看到它是如何调用<代码> INTINDOWS >代码>某个类型的代码< int > -Point < /COD>并因此抱怨丢失的实例-它甚至没有考虑到<代码>(15 20)<代码>的坏表达。< /P> < P> <强> <什么是错误/强> < /P>
data Point = Point {
              x, y :: Int
            } deriving (Show)
如果我们将构造函数
表示为一个函数,它可能会变得更加明显:

Point :: Int -> Int -> Point
如果您知道函数应用程序的语法,那么这一点就非常清楚了:

main = print $ Point 15 20
为什么会出现此错误

至于为什么损坏的代码会得到特定的错误,请考虑这是如何检查类型的。我们有这样的表达:

Point ( ...something... )

如果
Point::Int->Int->Point
,那么
Point something
必须是
Int->Point
类型(应用于任何单个参数的
Point
都是上述类型)。现在你可以看到它是如何调用“代码>打印/代码>某个类型的代码< int > -Point < /代码>,因此抱怨丢失的实例-它甚至不考虑坏代码的表达式>(15 20)< /代码> ./p>(15×20)。无效语法,因此我打赌您首先会遇到语法错误,然后是表达式“print$Point”上的类型错误,因为要恢复遗漏的解析器(15 20)”。我可能遗漏了一些信息however@Jake它是有效的语法,但
15
不是函数,因此不能应用于
20
。这很公平。我没有想到它实际上是有效的语法。不管怎样,你都应该在有效的Haskell@Jake但它可以编译!您可能需要
Text.Show.Functions
和灵活的实例,但是
main=print$Point(15 20)
instance(Integral a,Num a)=>Num(a->Int),其中fromInteger n=fromIntegral∘ (+(fromIntegral n))
现在您已经看到了它,无论是好是坏!哇,我从没想过这是可能的。荣誉但这对更糟糕的lol来说是挑战性的。“15 20”是无效语法,所以我打赌您首先会在表达式“print$Point”上出现语法错误,然后是类型错误,因为要恢复遗漏的解析器(15 20)”。我可能遗漏了一些信息however@Jake它是有效的语法,但
15
不是函数,因此不能应用于
20
。这很公平。我没有想到它实际上是有效的语法。不管怎样,你都应该在有效的Haskell@Jake但它可以编译!您可能需要
Text.Show.Functions
和灵活的实例,但是
main=print$Point(15 20)
instance(Integral a,Num a)=>Num(a->Int),其中fromInteger n=fromIntegral∘ (+(fromIntegral n))
现在您已经看到了它,无论是好是坏!哇,我从没想过这是可能的。荣誉但那是对更糟糕的lol的挑战。