如何在 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
作为旁注,我将定义 CommandList = [Command]
并去掉那个中缀类型构造函数。它确实看起来很有趣,但不太方便。
我刚刚注意到奇怪的地方
I need to do it without importing any functions that already exist.
在你的问题中。因为我认为这种限制很荒谬,所以我不会坚持它。如果您愿意,请自己从 Prelude 复制 foldl1
和 replicate
的实现。尽管严格来说您不必手动导入它们来使用它们。
我需要定义一个函数来移动 "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
作为旁注,我将定义 CommandList = [Command]
并去掉那个中缀类型构造函数。它确实看起来很有趣,但不太方便。
我刚刚注意到奇怪的地方
I need to do it without importing any functions that already exist.
在你的问题中。因为我认为这种限制很荒谬,所以我不会坚持它。如果您愿意,请自己从 Prelude 复制 foldl1
和 replicate
的实现。尽管严格来说您不必手动导入它们来使用它们。