Оператор ~
делает матч ленивым.Обычно сопоставление с шаблоном оценивает аргумент, так как необходимо проверить, не неудачно ли шаблон.Если вы префикс шаблона ~
, оценка не будет, пока он не понадобится.Эта функциональность часто используется в коде «Связывание узла» , где необходимо ссылаться на структуры, которые еще не созданы.Если при эваляции шаблон терпит неудачу, результат равен undefined
.
. Вот пример:
f (_:_) = True
f [] = False
g ~(_:_) = True
g [] = False
f []
дает False
, тогда как g []
дает true, потому чтопервый шаблон всегда совпадает.(Вы действительно получаете предупреждение для этого кода)
Тем не менее, вы можете видеть ~
как противоположность !
, что вызывает оценку аргумента, даже если он не нужен.
Обратите внимание, что эти операторы делают вещи строгими / ленивыми только на том уровне, на котором они применяются, а не рекурсивно.Например:
h ~((x,y):xys) = ...
Сравнение шаблонов на кортеже строгое, но шаблон "против" ленив.