F#绘制几何对象

时间:2018-12-02 20:10:32

标签: object f# draw

我必须创建3个功能。一个绘制一个矩形,另一个绘制一个三角形,最后一个绘制如下图所示的房子。

type RoboInstruction = | F | L | R

type RoboProgram =
    | Forward
    | Left
    | Right
    | Seq of RoboProgram * RoboProgram
    | Repeat of Nat * RoboProgram

let rectangle: RoboProgram = (....)
let triangle: RoboProgram = (....)
let nikolaus: RoboProgram = (....)

我尝试使用以下代码绘制矩形,但我不知道为什么不起作用:

let rectangle: RoboProgram =
  Repeat(2,
    Repeat(3N, Forward);
    Repeat(90N, Left);
    Repeat(2N, Forward);
    Repeat(90N, Left))

1 个答案:

答案 0 :(得分:1)

由于for i in range (10,-1,-1): b = "green bottles sitting on the wall" print(i, b, '\n', i, b, '\nAnd if one green bottle should accidentally fall\nThere will be', i, b) 命令使用元组,一次只能让您配对两个指令,因此您需要嵌套多个Seq才能将4条指令保存在一起。

(我之所以从Seq切换到Nat只是因为int要求我加载额外的库。)

您可以这样做:

Nat

或者这样:

let rectangle: RoboProgram =
    Repeat(2,
        Seq(
            Seq(Repeat( 3, Forward)
              , Repeat(90, Left   ))
          , Seq(Repeat( 2, Forward)
              , Repeat(90, Left   ))
        )
    )

第二种样式是函数式编程中绑定函数的典型代表。实际上,在F#中,您可以创建一个计算表达式来做到这一点:

let rectangle: RoboProgram =
    Repeat(2,
        Seq(Repeat( 3, Forward)
      , Seq(Repeat(90, Left   )
      , Seq(Repeat( 2, Forward)
      ,     Repeat(90, Left   )
        )))
    )

这将使您生成相同的代码,如下所示:

type RoboBuilder() = // Computation Expression builder
    member __.ReturnFrom x = x
    member __.Bind(x, f) = Seq(x, f x)

let robo = RoboBuilder()

如果最后一部分不清楚,请放心,这是F#的高级功能。