Я делаю именно то, что вы хотите в C. Хитрость заключается в том, чтобы скрыть каждый символ отдельно, например, так:
syn match ArrowHead contained ">" conceal cchar=▶
syn match ArrowTail contained "-" conceal cchar=─
syn match ArrowFull "->" contains=ArrowHead,ArrowTail
К сожалению, вы можете обнаружить, что ArrowHead или ArrowTail совпадают вне ArrowFull. Это связано с тем, что в существующих правилах синтаксиса используется contains=ALLBUT,...
или что-то подобное.
Чтобы исправить это в C, я добавил ArrowTail и ArrowHead в кластер cParenGroup, что, похоже, предотвращает любые проблемы.
syn cluster cParenGroup add=ArrowTail,ArrowHead
Возможно, вам потребуется сделать что-то подобное для Haskell.
Поскольку в противном случае я вообще не использую функцию сокрытия, я приказываю Vim идти вперед и «скрывать» стрелки ВСЕ время:
set conceallevel=1 concealcursor=nvic
Кстати, если вам не нравятся цвета по умолчанию для скрытых символов, вы можете изменить их следующим образом:
hi conceal ctermfg=DarkBlue ctermbg=none guifg=DarkBlue guibg=none