1

私のHaskellには別の問題があります。問題から次のデータコンストラクターが与えられました。

type Point = (Int, Int)

data Points = Lines Int Int
            | Columns Int Int
            | Union Points Points
            | Intersection Points Points

(0,0) から始まるグリッド上の点についてであり、(x,y) は、原点からの水平距離として x を持ち、原点からの垂直距離として y を持ちます。

これから関数「Lines」を定義しようとしました。これは、 Lines xy が与えられた場合、グリッド上の垂直距離 x ~ y を持つすべての点を評価します。例えば

> Lines 2 4 
(0,2)(1,2)(2,2)(3,2)....
(0,3)(1,3)(2,3)(3,3)....
(0,4)(1,4)(2,4)(3,4)....

等々。私がしたことは、

Lines :: Int -> Int -> Points
Lines lo hi = [ (_, y) | lo <= y && y <= hi ]

しかし、Haskell は次のように不満を述べています。

無効なタイプ シグネチャ Lines :: Int -> Int -> Points.
::の形式である必要があります

これはどういう意味ですか?「ポイント」はすでに上で定義されています...確かに「Int」「ポイント」は「タイプ」と見なされますか?問題がわかりません。Haskell が混乱しているのはなぜですか?

4

1 に答える 1

9
  1. 関数は大文字で始めてはなりません。linesしたがって、 ではなくを使用する必要がありますLines。これが、表示されているエラー メッセージの原因である可能性があります。

  2. 構文は結果のリスト[ ... ]を作成するためのものですが、型シグネチャは関数が返すと主張しています、これはどのような種類のリストでもありません。値のリストを返すつもりなら、それが型です。PointsPoint[Point]

  3. あなたの実装が何をLinesしようとしているのか、文字通りわかりません。構文は私には意味がありません。


わかりましたので、あなたのコメントを考慮して...

  • との間の数のリストは、lohi書くことで生成でき[lo .. hi]ます。

  • 「任意の」値を X に入れることができると言いますが、それが何を意味するのかを正確に突き止める必要があります。あなたの例は、0から上の数字が永遠に欲しいことを示唆しているようです。そのリストを生成する方法は[0 .. ]. (上限を指定しないと、リストは無限になります。)

  • あなたの例は、可能なすべての X 座標とペアになった同じ Y 座標を持つすべてのポイントを含む内側のリストを持つ、リストのリストが必要であることを示唆しています。

したがって、これを行う1つの可能な方法は次のとおりです。

type Point = (Int, Int)

lines :: Int -> Int -> [[Point]]
lines lo hi = [ [(x,y) | x <- [0..]] | y <- [lo .. hi] ]

これは、開き括弧と閉じ括弧がすべて含まれているため、おそらく少し読みにくいので、もう少しきれいにすることができます。

lines lo hi =
  let
    xs = [0..]
    ys = [lo .. hi]
  in [    [(x,y) | x <- xs]    | y <- ys]

これを実行すると、

> lines 2 4
[[(0,2), (1,2), (2,2), ...],
[(0,3), (1,3), (2,3), ...],
[(0,4), (1,4), (2,4), ...]]

つまり、外側のリストには 3 つの要素 (Y=2、Y=3、Y=4) があり、3 つの内側のリストはそれぞれ無限に長くなります (すべての可能な正の X 値)。

于 2012-12-16T12:15:12.107 に答える