OCaml - 从函数返回之前打印

问题描述

我在 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;;