2012-12-16 16 views
1

我的Haskell有另一個問題。我給從問題如下數據構造,什麼是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 x y將計算網格上垂直距離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」「Points」被認爲是「類型」?我沒有看到問題,爲什麼Haskell感到困惑?

+1

x值來自'lines'的位置?你想構建一個無限列表的列表嗎?然後嘗試'線'lo hi = map(\ y - > map(\ x - >(x,y))[0 ..])[lo..hi]'。請注意,已經有一個名爲'lines'的函數。 –

回答

9
  1. 函數不得以大寫字母開頭。所以你需要使用lines,而不是Lines。這可能是您看到的錯誤消息的來源。

  2. 語法[ ... ]是創建結果的名單,但你的類型的簽名聲稱,該函數返回Points,這是沒有任何一種名單。如果您打算返回一個Point值列表,那就是[Point]類型。

  3. 我硬是不知道你的Lines實現甚至試圖做的。語法對我來說沒有意義。


好了,把你的意見考慮......

  • 您可以通過編寫[lo .. hi]產生lohi之間號碼列表。

  • 你說的「任意」值可以在X去,但你需要牽制究竟是什麼意思。你的例子似乎表明你想要從0開始的數字永遠。生成列表的方式是[0 .. ]。 (沒有給出上限使得列表層出不窮)

  • 你的例子表明你想要一個列表列表,內部列表包含所有具有與所有可能的X座標配對的Y座標相同的點。

因此,這裏是一個可能的方式做到這一點:

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),並且三個內部列表中的每一個都是無限長的(每個可能的正的X值)。

+1

嗨,謝謝你的回答!好吧,我會嘗試將資本修改爲小寫...以及> Lines只是試圖生成一組點(Int,Int)給定的lo,hi。 (_,y)表示任意數字進入x條目,並且y大於或等於lo,小於或等於hi。至少這就是我的意圖......從來沒有在我的生活中做過編程,我對我的技能真的不自信...... – Brad

+0

@Brad列表理解語法基本上是'xs = [val | val = lo,y <= hi]'。 –

相關問題