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

あなたが報告している正確なエラー メッセージを再現することはできませんが、あなたの例には 2 つの問題があります。

  1. 型コンストラクターを介してパラメーター化されたものを派生させようとしてShowいます。Recこれは現時点で 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スタンドアロンの派生句を使用することで、インスタンスの前提条件を明示的に指定できます。この場合、これらの前提条件では、FlexibleContextsおよびUndecidableInstances拡張機能も有効にする必要があります。

問題 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、 を引数として使用できるのは、 がデータ型のRec場合のみです。Pt2これらの変更により、メイン関数は型チェック (および動作) します。

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 に答える