19

これはhttp://www.angelfire.com/tx4/cus/shapes/haskell98.htmlから取得したコードです。モジュール ヘッダーの名前をコメントにすると、WinGHCi で正しくコンパイルおよび実行されます。ただし、名前が保持されている場合はコンパイルされません。名前 MakeCircle でエラーが報告されます。私の質問は、MakeCircle をエクスポートしたいことを明示的に言及したい場合、どのようなコード変更が必要ですか?

module Circle -- (Circle, MakeCircle, getRadius, setRadius)
  where
  import Shape

  class Shape a => Circle a where
      getRadius :: a -> Int
      setRadius :: a -> Int -> a

  instance Shape CircleInstance where
      getX = x
      getY = y
      setX a newx = a {x = newx}
      setY a newy = a {y = newy}
      moveTo a newx newy = a {x = newx, y = newy}
      rMoveTo a deltax deltay = a {x = ((getX a) + deltax), y = ((getY a) + deltay)}
      draw a =
         putStrLn ("Drawing a Circle at:(" ++ (show (getX a)) ++ "," ++ (show (getY a)) ++
            "), radius " ++ (show (getRadius a)))

   instance Circle CircleInstance where
      getRadius = radius
      setRadius a newradius = a {radius = newradius}

   data CircleInstance = MakeCircle {x, y, radius :: Int}
      deriving(Eq, Show)
4

2 に答える 2

31

MakeCircle型のデータ コンストラクターCircleInstanceです。データ コンストラクターは、その定義型と組み合わせてのみエクスポートできます。おそらく、Circleクラス メソッドgetRadiussetRadius;もエクスポートする必要があります。現在のエクスポート リストでは、これらのメソッドはこのモジュールの外では使用できません。

エクスポート リストを次のように変更します

module Circle (Circle (..), CircleInstance (MakeCircle), getRadius, setRadius)

これは、エクスポートの 2 つの形式を示しています。エクスポートCircle (..)は、型クラスCircleとそのすべてのメソッドをCircleInstance (MakeCircle)エクスポートしますが、型コンストラクターCircleInstanceとそのデータ コンストラクターのみをエクスポートしますMakeCircle。MakeCircle に新しいデータ コンストラクター (おそらく ) を追加する場合、そのコンストラクターは、エクスポート リスト (つまり) で言及するか、エクスポートの形式を使用UnitCircleしない限り、モジュールからエクスポートされません。CircleInstance (MakeCircle, UnitCircle)(..)

于 2012-01-24T08:51:24.007 に答える
5

エクスポート リストが正しくありません。次のようにする必要があります。

module Circle(Circle, CircleInstance(MakeCircle), getRadius, setRadius)

多分

module Circle(Circle, CircleInstance(..), getRadius, setRadius)
于 2012-01-24T08:53:48.920 に答える