Haskell - haskell中的非详尽模式匹配

时间:2015-08-06 21:48:04

标签: 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

那么为什么编译器从未报告过这个问题,为什么在有很多像OCaml这样的语言时会在编译时清楚地报告这个问题时在Haskell中忽略它?

1 个答案:

答案 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: []