Haskell - Неисчерпывающее сопоставление шаблонов в haskell

Итак, я изучаю Haskell и хотел написать простой код, который просто повторяет каждую букву в строке дважды. Поэтому я придумал это:

repl :: String->String
repl " " = " "
repl (x:xs) = x:x:repl xs

Теперь при компиляции я не получил предупреждения, но произошла ошибка во время выполнения repl "abcd":

"abcd*** Exception: repl.hs:(2,1)-(3,23): Non-exhaustive patterns in function repl

Итак, почему компилятор никогда не сообщал об этом и почему он игнорируется в Haskell, когда есть много языков, таких как OCaml, которые отчетливо сообщают об этом во время компиляции?

Ответ 1

Предупреждение о совпадении шаблонов по умолчанию отключено. Вы можете включить его с помощью -fwarn-incomplete-patterns или как часть более крупного пучка предупреждений с помощью -W и -Wall.

Вы можете сделать это из ghci:

Prelude> :set -W

Вы также можете передать флаг ghc при компиляции или включении его в качестве прагмы поверх своего модуля:

{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}

Для вашей конкретной программы он должен дать следующее предупреждение:

/home/tjelvis/Documents/so/incomplete-patterns.hs:2:1: Warning:
    Pattern match(es) are non-exhaustive
    In an equation for ‘repl’: Patterns not matched: []