Object 绘制几何对象

Object 绘制几何对象,object,f#,draw,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 triang

我必须创建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))
由于Seq命令使用的元组一次只能对两条指令进行配对,因此需要嵌套多个Seq才能将4条指令保存在一起

我从Nat切换到int只是因为Nat需要我加载一个额外的库

您可以这样做:

let rectangle: RoboProgram =
    Repeat(2,
        Seq(
            Seq(Repeat( 3, Forward)
              , Repeat(90, Left   ))
          , Seq(Repeat( 2, Forward)
              , Repeat(90, Left   ))
        )
    )
let rectangle: RoboProgram =
    Repeat(2,
        Seq(Repeat( 3, Forward)
      , Seq(Repeat(90, Left   )
      , Seq(Repeat( 2, Forward)
      ,     Repeat(90, Left   )
        )))
    )
let rectangle3 =
    Repeat(2, robo {
        let! _ = Repeat( 3, Forward)
        let! _ = Repeat(90, Left   )
        let! _ = Repeat( 2, Forward)
        return!  Repeat(90, Left   )
    })
或者像这样:

let rectangle: RoboProgram =
    Repeat(2,
        Seq(
            Seq(Repeat( 3, Forward)
              , Repeat(90, Left   ))
          , Seq(Repeat( 2, Forward)
              , Repeat(90, Left   ))
        )
    )
let rectangle: RoboProgram =
    Repeat(2,
        Seq(Repeat( 3, Forward)
      , Seq(Repeat(90, Left   )
      , Seq(Repeat( 2, Forward)
      ,     Repeat(90, Left   )
        )))
    )
let rectangle3 =
    Repeat(2, robo {
        let! _ = Repeat( 3, Forward)
        let! _ = Repeat(90, Left   )
        let! _ = Repeat( 2, Forward)
        return!  Repeat(90, Left   )
    })
第二种风格是函数式编程中典型的绑定函数。实际上,在F中,您可以创建一个计算表达式来执行此操作:

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

let robo = RoboBuilder()
这将允许您生成如下相同的代码:

let rectangle: RoboProgram =
    Repeat(2,
        Seq(
            Seq(Repeat( 3, Forward)
              , Repeat(90, Left   ))
          , Seq(Repeat( 2, Forward)
              , Repeat(90, Left   ))
        )
    )
let rectangle: RoboProgram =
    Repeat(2,
        Seq(Repeat( 3, Forward)
      , Seq(Repeat(90, Left   )
      , Seq(Repeat( 2, Forward)
      ,     Repeat(90, Left   )
        )))
    )
let rectangle3 =
    Repeat(2, robo {
        let! _ = Repeat( 3, Forward)
        let! _ = Repeat(90, Left   )
        let! _ = Repeat( 2, Forward)
        return!  Repeat(90, Left   )
    })

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

您收到了什么错误消息?Fehlermeldung:Test method Tests+Tests.compile rechteck抛出异常:System.exception:TODO StapellerFolgung:at Program.CompilerBoProgram C:\Users\Alessandro\Documents\Uni KL\GrundAgendanderProgrammierung\Übungen\Aufgabe-06-3\Program.fs:31行atTests.Tests.compile rechteck在C:\Users\Alessandro\Documents\Uni-KL\GrundlagenderProgrammierung\Übungen\Aufgabe-06-3\Tests.fs中:从我看到的第22行,当语法错误时,您无法访问可以在键入时向您提供错误消息的IDE。这是正确的吗?你的代码似乎可以工作,但问题是我忘了写,我不能修改我的代码我必须写一个代码,它的函数是给我的Nat来自哪个库?事实上,我不知道我假设某个地方有一个自然数库。可能是为这个特定的课程创建的。