笛卡尔平面

时间:2012-10-01 03:35:03

标签: haskell functional-programming

我正在尝试在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] < / p>

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)]

任何人都知道如何解决这个问题!感谢

2 个答案:

答案 0 :(得分:4)

你错过了where,除了它看起来你有一些类型错误。

  1. [a]太笼统了
  2. /仅适用于小数类型。
  3. 所以

    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]
    

    可能就是你想要的。与你所拥有的或多或少相关的最小变化。

答案 1 :(得分:1)

我就是这样做的。 fromintegral是一种类型'glue'函数,可将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