我正在尝试在Haskell中定义一个函数,该函数接受一个整数参数c并返回(x/c,y/c)
形式x
和y
形式的笛卡尔平面上所有点的列表是整数。
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)]
任何人都知道如何解决这个问题!感谢
答案 0 :(得分:4)
你错过了where
,除了它看起来你有一些类型错误。
[a]
太笼统了/
仅适用于小数类型。 所以
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
(例如Double
或Rational
)才能使用/
运算符。
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