2

编译时:

data Rec t = Rec { intPt :: t Int, doublePt :: t Double } deriving Show

type Pt2 a = (a,a)
type Pt3 a = (a,a,a)

type Rec2 = Rec Pt2 
type Rec3 = Rec Pt3

main = do
      print $ Rec (1,2) (3.4,5.6)
      print $ Rec (1,2,3) (5.6, 7.8, 9.0)   

我有

Unexpected type `t a' where type variable expected
In the declaration of `Rec (t a)'

如何使这个编译和工作?

4

2 回答 2

5

我无法重现您报告的确切错误消息,但我可以看到您的示例存在两个问题。

  1. 您正在尝试通过类型构造函数对其进行参数化ShowRec目前这对于 GHC 来说很难完全自动完成,但是您可以通过启用一些扩展来使其在实践中工作。

  2. 您正在使用部分应用的类型同义词Pt2Pt3作为 的参数Rec,这是不允许的。您可以通过切换到数据类型来解决此问题。

更详细一点:要解决问题 1,您可以说:

{-# LANGUAGE StandaloneDeriving, FlexibleContexts, UndecidableInstances #-}

data Rec t = Rec { intPt :: t Int, doublePt :: t Double }
deriving instance (Show (t Int), Show (t Double)) => Show (Rec t)

通过使用独立的派生子句,您可以明确指定Show实例的先决条件。在这种情况下,这些前提条件还需要启用FlexibleContextsUndecidableInstances扩展。

要解决问题 2,您可以执行以下操作:

data Pt2 a = Pt2 a a deriving Show
data Pt3 a = Pt3 a a a deriving Show

type Rec2 = Rec Pt2 
type Rec3 = Rec Pt3

可以部分应用数据类型,但不能应用类型同义词。因此,仅当是数据类型时才允许将Pt2其用作参数。通过这些修改,您的主要功能类型检查(和工作):RecPt2

main = do
  print $ Rec (Pt2 1 2) (Pt2 3.4 5.6)
  print $ Rec (Pt3 1 2 3) (Pt3 5.6 7.8 9.0)   
于 2012-09-17T14:41:07.610 回答
0

我不确定您使用的是什么 GHC,但此代码中的错误是:

A.hs:6:1:
    Type synonym `Pt2' should have 1 argument, but has been given none
    In the type synonym declaration for `Rec2'

因为可能不会部分应用类型同义词,这对于 Rec2 的更高种类参数至关重要。

考虑使用例如类型族或显式数据而不是类型同义词。

于 2012-09-17T14:37:52.220 回答