如何在 DAML 中的另一个函数中定义局部函数?

How can I define a local function within another function in DAML?

我试图在另一个函数中定义一个本地函数,但似乎无法获得正确的语法。我有以下内容:

foo : Int -> Bool
foo i =
  let bar j = j < 5
  bar i

但是我在 bar 上遇到语法错误。定义此类函数的正确语法是什么?

对于普通的局部函数绑定,和一般let的变量绑定,你必须在定义完functions/variables之后使用in

  let bar j = j < 5
  in bar i

不带 inlet 可以在 do 块中使用 ,在这种情况下,为其余部分定义变量do 块的:

blah = do
  let bar j = j < 5
  assert $ not $ bar 5
  pure $ bar 5

但是,它只能在有效使用的地方使用 do。否则,使用 in.

where 子句也可以附加到定义中,代替 let:

foo i = bar i
  where bar j = j < 5

where 的这种用法与其在 template 语法中的作用无关。

请注意 where,虽然它在某些情况下更好,但对可以使用它的地方(抱歉)有相当的限制,而(再次抱歉)let/in工作任何地方 允许表达式:

foo i =
  let bar j = j < 5
  in bar (let q = 2 in i + q)

参见 daml docs on let and this discussion of when to use let or where