我必须创建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))
答案 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#的高级功能。