问题描述
我在 OCaml 中有一个函数,它返回两个数字的范围(取自 https://ocaml.org/learn/tutorials/basics.html):
var offsetX by remember { mutableStateOf(0f) }
var offsetY by remember { mutableStateOf(0f) }
Canvas(modifier = Modifier.fillMaxSize()
.pointerInput(Unit) {
detectDragGestures { change,dragAmount ->
change.consumeAllChanges()
offsetX += dragAmount.x
offsetY += dragAmount.y
}
}
){
val canvasquadrantSize = size / 2F
drawRect(
topLeft = Offset(offsetX,offsetY),color = Color.Green,size = canvasquadrantSize
)
}
这个函数很有意义,但我想实际打印出范围。
我的第一直觉是尝试这样的事情:
let rec range a b =
if a > b then []
else a :: range (a + 1) b;;
但这引发了错误:let rec range a b =
if a > b then []
else print_int a; a :: range (a + 1) b;;
这是有道理的,因为我现在基本上返回了一个单位值,因为 OCaml 将打印语句解释为它应该返回的内容。
那么,这里是否有一些最佳实践可以让我打印值,然后返回我想要的值?函数式编程的新手,请原谅这个简单的问题。
解决方法
正如@glennl 在评论中所说,这只是一个括号问题。
请注意,如果您觉得更清楚,您也可以使用 begin
end
结构代替括号(但这只是风格问题):
let rec range a b =
if a > b then []
else begin
print_int a;
a :: range (a + 1) b
end;;