Как я могу определить локальную функцию в другой функции в DAML? - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь определить локальную функцию в другой функции, но не могу понять синтаксис правильно.У меня есть следующее:

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

Но я получаю синтаксическую ошибку на bar.Какой правильный синтаксис для определения такой функции?

1 Ответ

1 голос
/ 12 марта 2019

Для обычных локальных привязок функций и привязок переменных с let в общем случае вы должны использовать in после определения всех функций / переменных:

  let bar j = j < 5
  in bar i

A let без in может использоваться в блоке do только , и в этом случае переменная определяется для остальной части блока do:

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

Однако это может толькоиспользоваться там, где допустимо использовать do.В противном случае использование in.

Предложение A 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 по let и это обсуждение того, когда использовать let или где.

...