如何在 haskell 中定义 n 边多边形函数

How to define an n-sided polygon function in haskell

我需要定义一个函数来移动 "pen",它从左下角的 (0,0) 开始,根据输入在形状的每一边绘制正确的多边形长度为 1。我需要在不导入任何已经存在的函数的情况下执行此操作。我正在使用 OpenGL 绘制形状。命令定义为:

data Command
= Fd Double
| Bk Double
| Lt Double
| Rt Double
| Go Command
| Command :> Command

我已经做了一个三角形,但现在我只想说出这个形状有多少条边,而不是定义每个形状。三角形:

triangle :: Command
triangle = Fd 1 :> Rt 120
    :> Fd 1 :> Rt 120
    :> Fd 1 :> Rt 120

cabal run polygon 6

应该创建一个六边形等等

到目前为止我得到的是:

polygon :: Int -> Command
polygon n = 

顶点之间的角度由公式360/n给出。所以每次轮流移动,重复n次:

polygon n = foldl1 (:>) . replicate n (Fd 1 :> Rt (360.0 / fromIntegral n))

分手:

polygon n = foldl1 (:>) sides
  where
    sides = replicate n side
    side = Fd 1 :> Rt angle
    angle = 360.0 / fromIntegral n

Working example online

作为旁注,我将定义 CommandList = [Command] 并去掉那个中缀类型构造函数。它确实看起来很有趣,但不太方便。


我刚刚注意到奇怪的地方

I need to do it without importing any functions that already exist.

在你的问题中。因为我认为这种限制很荒谬,所以我不会坚持它。如果您愿意,请自己从 Prelude 复制 foldl1replicate 的实现。尽管严格来说您不必手动导入它们来使用它们。