heist tutorial имеет пару примеров определения типа Splices
.
Если нажать на ссылку Splices
в пикши вы связаны выше, мы видим, что Splices
определяется следующим образом:
type Splices s = MapSyntax Text s
Если затем нажать на ссылку MapSyntax
, вы принимаете на docs для пакета map-syntax
. Это небольшой пакет, определяющий более удобный синтаксис для создания карт. Там пример в верхней части, но общая картина выглядит следующим образом:
mySplices = do
k1 ## v1
k2 ## v2
Поскольку предыдущее определение сказал нам, что ключи текста, мы можем сделать следующее, чтобы выяснить, что тип значений должен быть:
someFunc = do
...
renderWithSplices "my-template" mySplices
...
mySplices = do
"foo" ## I.textSplice "bar"
Если у вас есть достаточно недавнее GHC (я думаю, что 7.8 или выше), то подчеркивание на этой последней строке будет создать тип отверстия и вызвать компилятор, чтобы сказать вам, что тип вещи в том, что местоположение должно быть. Тогда вы можете написать соответствующую вещь этого типа, и должно быть более очевидно, что делать дальше.
Я действительно ценю ваш ответ, однако при нескольких попытках я, казалось, спустился по кроличьей норе с типами (у меня нет большого опыта работы с монадными трансформаторами и продолжал сражаться с типом HeistT). Что касается 'mySplices' - кажется, что' k1, v1, k2, v2' не могут быть просто строками/текстовыми значениями? –
Я не могу дать вам лучший ответ без лишнего контекста (в идеале фактического кода) о том, как вы пытаетесь использовать Heist. – mightybyte
Мне было трудно понять, как получить значение 'Splice s' для' v1' или 'v2' в примере. Я пытался просто использовать строку, поэтому в конечном итоге я понял, что мне просто нужно «I.textSplice» для этой цели: «k1» ## I.textSplice «exampleValue». Я думаю, что это добавило бы ясности в ответ, если бы у вас было фактическое значение, а не отверстие типа (для 'k1',' v1' и т. Д.) –