所以我正在学习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
那么为什么编译器从未报告过这个问题,为什么在有很多像OCaml这样的语言时会在编译时清楚地报告这个问题时在Haskell中忽略它?
答案 0 :(得分:14)
默认情况下,模式匹配警告处于关闭状态。您可以使用-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: []