2012-10-01 173 views
2

我想在Haskell中定義一個函數,它需要一個整數參數c並返回表格(x/c,y/c)的笛卡爾平面上的所有點的列表,其中xy是整數。 x/c爲-2和1 y/r之間是-1和1笛卡爾平面

之間這是我已經得到了到目前爲止這我幾乎可以肯定是正確的,但我對輸入=得到一個解析錯誤,當我尤其是在這一行中運行:cart xs ys c = [(y/c,x/c) | x <- xs, y <- ys]

plane :: Int -> [a] 
plane c = cart [-1*c .. 1*c] [-2*c .. 1*c] c 
    cart xs ys c = [(y/c,x/c) | x <- xs, y <- ys] 

樣本輸出是:plane 1將產生:

[(-2.0, -1.0), (-1.0, -1.0), (0.0, -1.0), (1.0, -1.0), 
(-2.0, 0.0), (-1.0, 0.0), (0.0, 0.0), (1.0, 0.0), 
(-2.0, 1.0), (-1.0, 1.0), (0.0, 1.0), (1.0, 1.0)] 

任何人有任何想法,我怎麼能解決這個問題!謝謝

回答

4

你錯過了where,除了它看起來像你有一些類型的錯誤。

  1. [a]太一般
  2. /僅適用於分數的類型。

所以

plane :: Int -> [(Int,Int)] 
plane c = cart [-1*c .. 1*c] [-2*c .. 1*c] c where 
    cart xs ys c = [(y `div` c,x `div` c) | x <- xs, y <- ys] 

可能是你想要什麼。從你所擁有的或多或少的作品中做出最小的改變。

+0

謝謝@PhilipJF。我一直在犯最小的錯誤。有一天我會征服函數式編程 – NuNu

+0

'div'是'Integral a => a - > a - > a',因此只返回整數值,但我認爲實數或有理數是需要的。 – NovaDenizen

1

這就是我該怎麼做的。 fromintegral是一種「膠水」功能,可將Integral類型類中的任何值轉換爲Num類型類中的任何其他類型。結果類型必須在RealFrac(如DoubleRational)中才能使用/運算符。

plane :: (Integral a, RealFrac b) => a -> [(b,b)] 
plane d = [(fI y/fI d,fI x/fI d) | x <- [-2*d..d], y <- [-d..d]] 
    where fI = fromIntegral