Следующая программа Haskell нарушена, поскольку она выполняет неполную привязку шаблона:
main = do
[x] <- pure ["foo", "bar"]
print x
Если вы скомпилируете его, вы не получите никаких предупреждений:
$ ghc -fwarn-incomplete-uni-patterns -o example example.hs
[1 of 1] Compiling Main ( example.hs, example.o )
Linking example ...
но если вы запустите его, вы получите:
example: user error (Pattern match failure in do expression at example.hs:2:3-5)
Я хотел бы как-то получить предупреждение о компиляторе.
Из документации я бы подумал, что -fwarn-incomplete-uni-patterns
сделает это, поскольку блок do
выделяет следующие параметры:
desugared = pure ["foo", "bar"] >>= \[x] -> print x
И действительно, добавив, что в файл примера выдается предупреждение:
$ ghc -fwarn-incomplete-uni-patterns -o example example.hs
[1 of 1] Compiling Main ( example.hs, example.o )
example.hs:1:37: Warning:
Pattern match(es) are non-exhaustive
In a lambda abstraction:
Patterns not matched:
[]
_ : (_ : _)
Как получить аналогичное предупреждение, когда я делаю то же самое внутри блока do
?
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.10.3