如何在 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
不带 in
的 let
可以在 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。
我试图在另一个函数中定义一个本地函数,但似乎无法获得正确的语法。我有以下内容:
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
不带 in
的 let
可以在 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。